4

我正在开发一个工具来合并两个具有相同架构但不同数据的数据库。

其中一部分是将所有外键更改为ON UPDATE CASCADE,然后递增所有主键以避免冲突并保持外键指针正常工作。

我的问题是,有时有一些孤立的行带有损坏的 FK,所以下面的查询:

UPDATE table set pk = pk + 1000000

像这样失败: ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails......(尽管我什至没有考虑触摸外键列!)

我想通过以下方式关闭它:

Set foreign_key_checks=0

但随后相关的外键不会更新。我做了一个快速测试,设置foreign_key_checks = 0后级联不起作用。

有什么方法可以触发级联,或者在没有设置的情况下更新 FK 损坏的行foreign_key_checks=0UPDATE IGNORE不能解决这个问题:(

4

1 回答 1

1

您应该首先修复参照完整性。

  1. 如果关系是组合类型,则删除孤立行
  2. 否则将 fk 字段更新为 null

之后,您的操作将正常工作。

附加信息:

如果列是NOT NULL,则表示此关系为 1*。在这种情况下,您必须在父表中添加一个虚拟行(例如,“VIRTUAL PARENT”行)并将所有指向不存在的父级的 fks 更新为该行。这将允许您稍后继续处理数据,而且可以轻松地检索它们。

如果您认为 1* 没有必要(0* 对于您的技术/应用层来说就足够了),那么只需将该列设置为可为空。

于 2012-09-14T18:40:39.350 回答