Nea*_*eal 68 mysql insert on-duplicate-key
我知道ON DUPLICATE KEY UPDATE如果已经存在该密钥的记录,您可以使用更新某个值,
我可以做这个:
INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE `a`=1, `b`=2, `c`=3
Run Code Online (Sandbox Code Playgroud)
但是,如何在不必写出两次列和值的情况下执行此操作?
Lig*_*ica 93
您可以通过不必重复该值来获得一半:
INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`);
Run Code Online (Sandbox Code Playgroud)
但是你仍然需要列出列.
小智 38
使用 REPLACE INTO
意思REPLACE INTO是如果新记录显示新的键值,则它将作为新记录插入.
如果新记录具有与预先存在的记录匹配的键值,则将忽略密钥违规,并且新记录将替换预先存在的记录.
Jav*_*r P 13
如果它有用,我提出了一个查询,以避免手动编写"on duplicate"查询的最后一部分,对于版本> = 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';
Run Code Online (Sandbox Code Playgroud)
它的输出是这样的:
a=values(a), b=values(b), c=values(c), d=values(d)
Run Code Online (Sandbox Code Playgroud)
在具有列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)
Run Code Online (Sandbox Code Playgroud)
更新: 对于很长的列列表,您可能会看到截断的输出,您可以在上面的查询之前使用此语句(感谢Uncle iroh):
SET SESSION group_concat_max_len = 1000000;
Run Code Online (Sandbox Code Playgroud)
根据 @BhendiGawaar 对 @Lightness Races in Orbit 的回答的评论,这里是 MySQL 8.019+ 版本:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
ON DUPLICATE KEY UPDATE c = new.a+new.b;
Run Code Online (Sandbox Code Playgroud)
或者
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
ON DUPLICATE KEY UPDATE c = m+n;
Run Code Online (Sandbox Code Playgroud)
set也适用于:
INSERT INTO t1 SET a=1,b=2,c=3 AS new
ON DUPLICATE KEY UPDATE c = new.a+new.b;
INSERT INTO t1 SET a=1,b=2,c=3 AS new(m,n,p)
ON DUPLICATE KEY UPDATE c = m+n;
Run Code Online (Sandbox Code Playgroud)
关于使用的弃用警告VALUES:
从 MySQL 8.0.20 开始,不推荐使用 VALUES() 来引用新行和新列,并且可能会在 MySQL 的未来版本中删除。相反,请使用行和列别名,如本节接下来的几段所述。