mysql into语法 - “INSERT IGNORE”与“INSERT...ON DUPLICATE KEY UPDATE”




insert多条 insert批量 (9)

在执行有多行的INSERT语句时,我想跳过会导致失败的重复条目。 经过一番研究,我的选择似乎是使用以下两种方法之一:

  • ON DUPLICATE KEY UPDATE ,这意味着一些代价不必要的更新,或者
  • INSERT IGNORE暗示其他类型的失败的邀请未经宣布。

我在这些假设中是否正确? 简单地跳过可能导致重复的行并继续到其他行的最佳方法是什么?


Answers

我经常使用INSERT IGNORE ,这听起来就像你正在寻找的那种行为。 只要你知道那些会引起索引冲突的行将不会被插入,并且你相应地计划你的程序,它应该不会造成任何麻烦。


Replace Into看起来像一个选项。 或者你可以检查

IF NOT EXISTS(QUERY) Then INSERT

这将插入或删除然后插入。 我倾向于首先进行IF NOT EXISTS检查。


我知道这是旧的,但我会添加此笔记,以防其他人(如我)在试图在INSERT..IGNORE上查找信息时到达此页面。

如上所述,如果使用INSERT..IGNORE,则执行INSERT语句时发生的错误将被视为警告。

没有明确提到的一件事是INSERT..IGNORE将导致插入时将无效值调整为最接近的值(而如果不使用IGNORE关键字,无效值将导致查询中止)。


一些重要的补充:当使用INSERT IGNORE并且确实存在关键违例时,MySQL不会发出警告!

例如,如果您尝试一次插入100条记录,而一条记录错误,则会进入交互模式:

Query OK, 99 rows affected (0.04 sec)

Records: 100 Duplicates: 1 Warnings: 0

正如你所看到的:没有警告! 这种行为甚至在官方的Mysql文档中被错误地描述。

如果你的脚本需要被告知,如果一些记录还没有被添加(由于关键违规),你必须调用mysql_info()并解析它以获得“Duplicates”值。


如果要在表中插入主键或唯一索引的冲突,它将更新有冲突的行,而不是插入该行。

句法 :

插入到table1中设置column1 = a,column2 = b on dulplicate update column2 = c;

现在在这里,这个插入语句可能与您以前看到的不一样。 这个插入语句试图在table1中插入一行,分别将a和b的值插入到column1和column2列中。

让我们深入理解这个说法:

例如: - 这里column1被定义为table1中的主键。

现在,如果在table1中没有列1中具有值“a”的行。 所以这个语句将在table1中插入一行。

现在,如果在table1中有一列在第2列中具有值“a”。 因此,此语句将使用“c”更新行的column2值,其中column1值为“a”。

所以,如果你想插入一个新的行,否则更新该行的主键或唯一索引的冲突。 阅读更多关于此链接


如果使用带有SHOW WARNINGS; insert ignore SHOW WARNINGS; 查询集结尾处的语句将显示包含所有警告的表格,其中包括哪些ID是重复的。


在DUPLICATE KEY UPDATE中并不是真正的标准。 这与REPLACE的标准一致。 请参阅SQL MERGE

基本上这两个命令都是标准命令的替代语法版本。


INSERT IGNORE的潜在危险。 如果您尝试插入VARCHAR值的时间过长,则使用 - 定义列,则该值将被截断并插入,即使已启用严格模式。


我通常会做其他海报中的其他几位海报,先检查它是否存在,然后采取正确的道路。 在做这件事时你应该记住的一件事是,由sql缓存的执行计划对于一个路径或其他路径可能不是最佳的。 我相信最好的方法是调用两个不同的存储过程。

FirstSP:
If Exists
   Call SecondSP (UpdateProc)
Else
   Call ThirdSP (InsertProc)

现在,我并不经常遵循我自己的建议,所以拿一粒盐来。







mysql insert