MYSQL无重复插入数据更新语法sql一句话使insert时若主键重复则更新如果你指定了ON DUPLICATE KEY UPDATE命令语句,那么在唯一索引或者主索引的作用下将不插入与记录重复的内容,但同时会更新数据库中的旧记录。例如,字段a被声明为唯一索引并且里面只包含有值

MYSQL无重复插入数据更新语法&sql一句话使insert时若主键重复则更新

如果你指定了ON DUPLICATE KEY UPDATE命令语句,那么在唯一索引或者主索引的作用下将不插入与记录重复的内容,但同时会更新数据库中的旧记录。例如,字段a被声明为唯一索引并且里面只包含有值为1的记录,以下两个语句会达到同样的效果:

www.2cto.com

一、 INSERT INTO table ( a , b , c ) VALUES ( 1 , 2 , 3 )

ON DUPLICATE KEY UPDATE c = c + 1 ;

二、 UPDATE table SET c = c + 1 WHERE a = 1 ;

受影响的是a=1的行,当插入时c的值加1。

如果字段b也是唯一的话,这个插入语句将和以下语句的效果一样:

UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

如果a=1 OR b=2匹配了不止一行,也只是第一行被更新。一般地,如果表中有多个唯一索引的话,你应该避免在使用用ON DUPLICATE KEY子句。

你可以在插入更新语句 INSERT ... UPDATE 中使用 VALUES(字段名) 函数去关联某一行记录。也就是说, VALUES(字段名) 可以用在UPDATE语句中去更新某字段的值而不会出现重复键。这个函数在多行插入中尤其有用。但是函数 VALUES() 仅当用在 INSERT ... UPDATE 语句中才有意义,否则会返回NULL。例如:

INSERT INTO table ( a , b , c ) VALUES ( 1 , 2 , 3 ) , ( 4 , 5 , 6 )

ON DUPLICATE KEY UPDATE c = VALUES ( a ) + VALUES ( b ) ;

这个语句和下面两个是同效果的:

www.2cto.com

INSERT INTO table ( a , b , c ) VALUES ( 1 , 2 , 3 )

ON DUPLICATE KEY UPDATE c = 3 ;

INSERT INTO table ( a , b , c ) VALUES ( 4 , 5 , 6 )

ON DUPLICATE KEY UPDATE c = 9 ;

如果表中包含有一个自动递增字段AUTO_INCREMENT,并用 INSERT ... UPDATE插入一行,函数 LAST_INSERT_ID()会返回AUTO_INCREMENT的值,如果这个语句更新某一行, LAST_INSERT_ID() 就没有意义了。但是,你可以通过用 LAST_INSERT_ID(expr)使它变得有意义,假如id字段是自动递增栏的话,使 LAST_INSERT_ID() 对更新语句有意义的方法如下:

INSERT INTO table ( a , b , c ) VALUES ( 1 , 2 , 3 )

ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID ( id ) , c = 3 ;

如果你使用 ON DUPLICATE KEY UPDATE 语句的话,延迟执行选项 DELAYED 将被忽略。