从一个表复制到另一个表,如何对整个数据集执行外键检查,但不对单独的行执行?

问题描述 投票:0回答:1

我正在使用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不会使数据库检查所有数据的一致性。无论如何,这需要太多的资源。

mysql sql
1个回答
0
投票

这很棘手。启用FOREIGN_KEY_CHECKS后,我不知道有什么办法让MySQL重新检查外键引用。

您可以检查自己是否有孤儿行,如果有,则回滚。

id

另一种可能性是使用INSERT和IGNORE选项,它将跳过失败的行。然后在循环中重复相同的语句,只要您看到“受影响的行”超过0。

parent_id < id
© www.soinside.com 2019 - 2024. All rights reserved.