有没有办法使用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;