MySQL INSERT ... ON DUPLICATE KEY UPDATE和IGNORE

时间:2018-03-03 23:00:51

标签: mysql

我正在向MySQL输入大量数据,这些数据经常被更新(基于唯一索引)。

鉴于以下陈述......

INSERT INTO 'players' ('id', 'parent', 'child_name')
VALUES
('1', '100', 'john'),
('2', '200', 'bob'),
('3', '300', 'chris')
ON DUPLICATE KEY UPDATE `parent` = VALUES(`parent`), `child_name` = 
VALUES(`child_name`), `id` = VALUES(`id`)

在某些情况下,Feed不正确且父级不存在,因此失败并显示错误..

Cannot add or update a child row: a foreign key constraint fails

我想知道的是,它是否在此bulk upsert上插入好行或整个语句是否失败,如果是这样,我需要添加ignore以确保它有效吗?

非常感谢提前

1 个答案:

答案 0 :(得分:0)

带有innodb的MySql(可能是您的引擎)是ACID。默认情况下Innodb上的所有insert语句都是自动完成的,这意味着如果语句的任何部分失败,则不会发生插入。

您可以使用IGNORE,任何失败的值集都会被完全跳过,但是我不建议这样做,因为它会默默地隐藏任何其他错误(您可能不会想到的其他错误)。为什么在插入之前不验证记录是否符合约束?

同样,您可以更改交易设置并插入tansaction:https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html。但是,说实话,我从来没有这样做,所以我不确定如果几行失败会怎么样。在失败的一个停止插入之后剩余的那个会停止吗?