MySQL关于重复密钥更新语法的分析
如果在最后插入语句中指定的重复密钥更新,以及插入行将导致唯一索引或主键中的重复值,则以重复的值更新;如果只有值列不会导致重复,则插入新行。
例如,如果列A是主键或具有唯一索引并包含1的值,则以下两个语句具有相同的效果:
复制代码代码如下所示:
插入表格(A,C)值(1,3)重复密钥更新C = C + 1;
更新表集C=C + 1,其中a = 1;
如果将行插入为新记录,则受影响行的值将显示为1;如果更新原始记录,则受影响行的值显示为2。
这个语法也可以用这种方式使用:
如果插入多行记录(假设是主键或唯一索引是一列):
复制代码代码如下所示:
插入表格(A,C)值(1,3),(1)重复密钥更新;
执行后,C的值是4(第二个重复,第1个C,原来的C)。
复制代码代码如下所示:
INSERT INTO TABLE (a, c) VALUES (1,3), (1,7) ON DUPLICATE KEY UPDATE;
执行后,C的值将更改为7(第二个值与第一个值相反,C的值直接为7)。
注意:重复密钥更新只是MySQL的惟一语法,而不是SQL标准语法!
这种语法和适合在使用中需要确定的记录是否存在,不存在是否存在更新的场景。
插入..复制密钥更新多行记录
如果重复密钥更新是在插入语句结束后指定,插入一行,它会导致一个唯一索引或主键重复的值,然后执行旧线更新;如果它不引起的独特价值列复制,插入新的一行。例如,如果列定义为独特的、包含值1,以下两种说法都有同样的效果:
复制代码代码如下所示:
插入表(A,B,C)
值(1,2,3)重复密钥更新C = C + 1;
更新表集C=C + 1,其中a = 1;
如果将行插入为新记录,则受影响行的值为1;如果更新原始记录,则受影响行的值为2。
如果你想知道更多关于插入的功能描述…在复制的钥匙,看MySQL参考文件:第13.2.4。插入语法
现在的问题是,如果插入以多行记录,那么如何在重复密钥更新之后指定以下字段的值要知道INSERT语句中只有一个重复密钥更新,无论他将更新一行还是更新所有需要更新的行。这是困扰我很久的问题。事实上,所有的问题都是用值()函数来解决的。
例如,该领域是独特的,并有记录(2,2,9)和(3,2,1)在原始数据库中的表。如果插入记录的值与原始记录重复,则更新原始记录,否则插入新行。
复制代码代码如下所示:
插入到表(a,b,c)值中
(1,2,3),
(2,5,7),
(3,3,6),
(4,8,2)
关于重复密钥更新b =值(b);
上述SQL语句的执行发现在(2,5,7)与原记录的独特价值冲突(2,2,9)。然后重复密钥更新时,原来的记录(2,2,9)更新为(2,5,9)、的(3,2,1)更新为(2,2,9),和新的记录插入。
注意:重复密钥更新只是MySQL的惟一语法,而不是SQL标准语法!