在执行包含许多行的INSERT语句时,我希望跳过重复的条目,否则会导致失败。经过一番研究,我的选择似乎是使用任何一种:
ON DUPLICATE KEY UPDATE,这意味着在某些代价下进行不必要的更新,或者 INSERT IGNORE暗示着邀请其他类型的失败在未通知的情况下潜入。
我的这些假设对吗?简单地跳过可能导致重复的行并继续到其他行,最好的方法是什么?
在执行包含许多行的INSERT语句时,我希望跳过重复的条目,否则会导致失败。经过一番研究,我的选择似乎是使用任何一种:
ON DUPLICATE KEY UPDATE,这意味着在某些代价下进行不必要的更新,或者 INSERT IGNORE暗示着邀请其他类型的失败在未通知的情况下潜入。
我的这些假设对吗?简单地跳过可能导致重复的行并继续到其他行,最好的方法是什么?
当前回答
ON DUPLICATE KEY UPDATE并不是真正的标准。它和REPLACE一样标准。参见SQL MERGE。
实际上,这两个命令都是标准命令的替代语法版本。
其他回答
ON DUPLICATE KEY UPDATE并不是真正的标准。它和REPLACE一样标准。参见SQL MERGE。
实际上,这两个命令都是标准命令的替代语法版本。
如果使用插入忽略有一个显示警告;语句将显示一个包含所有警告的表,包括哪些id是重复的。
插入……ON DUPLICATE KEY UPDATE优先用于防止意外异常管理。
当您只有**1个唯一约束时,此解决方案才有效
在我的例子中,我知道col1和col2组成了一个唯一的综合指数。
它会跟踪错误,但不会对副本抛出异常。 关于性能,相同值的更新是有效的,因为MySQL注意到这一点,并且不更新它
INSERT INTO table
(col1, col2, col3, col4)
VALUES
(?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
col1 = VALUES(col1),
col2 = VALUES(col2)
使用这种方法的想法来自phpdelusions.net/pdo上的评论。
替换成似乎是一个选择。或者你可以查一下
IF NOT EXISTS(QUERY) Then INSERT
这将插入或删除然后插入。我倾向于先进行IF NOT EXISTS检查。
我经常使用INSERT IGNORE,这听起来也正是您正在寻找的那种行为。只要知道不会插入会导致索引冲突的行,并且相应地规划程序,就不应该造成任何麻烦。