有没有办法使用ON DUPLICATE KEY更新所有我想插入?

我知道你可以使用ON DUPLICATE KEY UPDATE来更新一个特定的值,如果这个键已经有logging的话,

我可以做这个:

 INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE `a`=1, `b`=2, `c`=3 

但是,我怎样才能做到这一点,而不必两次写出列和值?

不幸的是,

你可以通过不必重复的值得到一半:

 INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3) ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`); 

但是你仍然需要列出列。

使用REPLACE INTO

REPLACE INTO的含义是,如果新logging呈现新的键值,则将其作为新logging插入。

如果新logging的关键值与预先存在的logging相匹配,则将忽略关键违规,新logging将replace原有logging。

如果它有用,我做了一个查询,以避免手动写入“重复”查询的最后部分,对于版本> = 5.0:

 SELECT GROUP_CONCAT( CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name'; 

其输出是这样的:

 a=values(a), b=values(b), c=values(c), d=values(d) 

在具有列a,b,c和d的表上,所以可以追加到查询的第一部分:

 INSERT INTO `tableName` (`a`,`b`,`c`, `d`) VALUES (1,2,3,4) ON DUPLICATE KEY UPDATE a=values(a), b=values(b), c=values(c), d=values(d) 

更新:对于一个非常长的列列表,你可能会看到一个截断的输出,你可以在上面的查询之前使用这个语句(谢谢Uncle iroh ):

 SET SESSION group_concat_max_len = 1000000;