状态描述
我有两个数据库,DB1
和 DB2
,它们具有相同的表 Author
,其中字段为 Author.ID
和 Author.AuthorName
。
DB1.Author
的 Author.ID
字段有 AUTO_INCRMENT,而 DB2.Author
没有 AUTO_INCRMENT,因为它依赖于 DB1
数据的正确性.
两个表都有 Author.ID
上的 PRIMARY 索引和 Author.AuthorName
上的唯一索引。
DB2.Author
具有从 DB1.Author
复制的行。
两个数据库均使用 MariaDB 版本 10.6.7。
问题
DB1
管理员删除了 DB1.Author
表中的一些条目,然后重新排序了索引以使索引号没有间隙。这意味着他们可能已经:
ID | 作者姓名 |
---|---|
1 | 一个 |
2 | B |
3 | C |
然后他们删除了 AuthorName
为 'B'
的行:
ID | 作者姓名 |
---|---|
1 | 一个 |
3 | C |
他们最终更新了索引,使其没有间隙(3-C 更改为 2-C):
ID | 作者姓名 |
---|---|
1 | 一个 |
2 | C |
现在我需要找到一种方法将行的更新状态从 DB1.Author
复制到 DB2.Author
而不删除 DB2.Author
表中的所有内容,这样我就不会'不会丢失 CASCADE
效果的数据。
最好的方法是什么?
我的镜头
这就是我所做的,但它显然无法工作,因为在重复键的情况下,它会尝试创建另一个重复键(重复的 ID
2 会尝试插入 'C'
的重复值,因为它ID
上已存在 3):
INSERT INTO DB2.Author (ID, AuthorName) SELECT DB1.Author.ID, DB1.Author.AuthorName FROM DB1.Author ON DUPLICATE KEY UPDATE ID = DB1.Author.ID, AuthorName = DB1.Author.AuthorName;
其他方法?
除了可能的SQL查询解决方案之外,是否还有其他方法可以在一个数据库更改数据时自动更新另一个数据库中的表数据?仅需要复制某些表,而其他链接表则不同。
tl;博士,您的问题是您的数据库管理器。解决方案是让他/她通过将数据恢复到之前的状态来消除所造成的损害。删除行就可以了。更新主键永远都不行。
不要通过解决他/她的错误来创建解决方案或验证它,因为这样做会使它更有可能再次发生。
完整答案。
您的实际问题是您的“数据库管理员”,他违反了数据库的基本规则:永远不要更新代理键值!
在您的情况下,情况更加悲惨,因为 ID 列值中的间隙无论如何都无关紧要。如果差距确实很重要,那么你的情况就更糟了。请允许我解释一下...
作者姓名是您的实际标识符。我们知道这一点是因为它有一个独特的约束。
ID 列是一个代理键,最方便地实现为自动递增整数,但如果代理键是随机(唯一)数字,那么代理键也可以正常工作。间隙,甚至值本身的选择,与代理键的有效性无关。