在这个sql语句中
INSERT INTO child (parentId, value) SELECT parentId, value FROM temptablechild.parentId是指向parent.id的外键。在运行此长时间运行的parent语句(可插入数百万行)时,可以随时删除INSERT INTO表中的行。
如果child表在parent 中没有对应的外键,则在INSERT INTO语句开始运行之前,或者如果在运行INSERT INTO时,从child引用的parent表中的一行被删除,则我希望INSERT INTO安静地忽略该特定行(并跳过插入到child违反外键约束的行),而不是整个语句失败。
我怎样才能做到这一点?在这种情况下,我不太熟悉任何比赛条件。
发布于 2017-02-20 23:28:06
您可以尝试在SELECT中锁定表SELECT中引用的行。
INSERT INTO child (parent_id, value)
SELECT t.parent_id, t.value
FROM temptable t
JOIN parent p ON t.parent_id = p.id
FOR UPDATE OF p;但是,请注意,当表parent同时被其他事务强烈修改时,这种预防性锁定可能会显著增加执行时间。
作为一种补救措施,您可以考虑在多个事务中执行插入,方法是将数据划分为逻辑分区。
INSERT
...
WHERE parent_id < 1000
INSERT
...
WHERE parent_id BETWEEN 1001 AND 2000 -- and so on.https://stackoverflow.com/questions/42355651
复制相似问题