我正在使用MySQL。让我们假设我有一个表qazxsw poi有两列:qazxsw poi,qazxsw poi。
hierarchy
指的是同一张表中其他行的id
,所以我在那里有外键。
parent_id
表包含一些数据,但它们现在不相关。
我还有一个名为parent_id
的第二个表,它具有相同的列,但没有设置外键限制。
id
包含:
hierarchy
现在我想将new_hierarchy_entries
中的所有行复制到new_hierarchy_entries
中。当我天真地跑:
id parent_id
2 1
1 null
我收到错误:无法添加或更新子行:外键约束失败(my_db.new_hierarchy_entries
,CONSTRAINT hierarchy_ibfk_2 FOREIGN KEY(parent_id)REFERENCES hierarchy
(id))
当然,如果逐行插入行,则无法插入第一行(id = 2,parent = 1),因为表INSERT INTO hierarchy SELECT * FROM new_hierarchy_entries
中没有id = 1的行。
另一方面,如果一次添加所有行,则将满足约束。那么如何以这样的方式复制行,以确保复制后满足约束,但复制时可能不满意?
hierarchy
排序的hierarchy
行无济于事。我不能假设hierarchy
在同一行。
按层次结构排序new_hierarchy_entries
行(使用树术语,先给我留下,然后给他们的父母等)会有所帮助,但我不确定如何在MySQL查询中这样做。
我玩弄了暂时关闭FOREIGN_KEY_CHECKS的想法。但后来我可以插入不一致的数据,我不会发现。打开FOREIGN_KEY_CHECKS不会使数据库检查所有数据的一致性。无论如何,这需要太多的资源。
这很棘手。启用FOREIGN_KEY_CHECKS后,我不知道有什么办法让MySQL重新检查外键引用。
您可以检查自己是否有孤儿行,如果有,则回滚。
id
另一种可能性是使用INSERT和IGNORE选项,它将跳过失败的行。然后在循环中重复相同的语句,只要您看到“受影响的行”超过0。
parent_id < id