如何使用旧行和新行执行 INSERT ... ON DUPLICATE KEY UPDATE?
How to do INSERT ... ON DUPLUCATE KEY UPDATE with old and new rows?
我想向我的关系 table 添加行,其中将更新旧行并添加新行。这是我的查询(ID 是唯一的键):
INSERT INTO table_rel (ID, player, team, status) VALUES (1,1,1,0), (2,3,1,1)
ON DUPLICATE KEY UPDATE status=VALUES(status);
在应该创建的行中用什么代替 ID?例如。 (false,2,1,1)
你不知道。有:
INSERT INTO table_rel (ID, player, team, status) ...
您承诺提供所有列出的值。然后用
... VALUES (1,1,1,0), (2,3,1,1)
ON DUPLICATE KEY UPDATE status=VALUES(status);
您提供的是实际值,ID
包括在内(即使是新条目)。在这种情况下,如果没有任何 ID=1
或 ID=2
条目将被创建,否则对于重复键 value
将被覆盖。
另一种解决方案,如果您不想为新条目指定键,则必须使用不同的语句(注意缺少的列):
INSERT INTO table_rel (player, team, status) VALUES (1,1,0), (3,1,1)
假设 table_rel
在 ID
上有 AUTO_INCREMENT
选项(以防万一:ALTER TABLE table_rel MODIFY ID INTEGER NOT NULL AUTO_INCREMENT;
)。
更新:
依靠 AUTO_INCREMENT
你可以提供一个 NULL
密钥,让引擎为你生成一个新密钥。有关更完整的说明,请参阅 。
如果这是 AUTO_INCREMENT 列,您可以提供 NULL
值。
最简单的方法是关键字 NULL
INSERT INTO table_rel (ID, player, team, status) VALUES
(1,1,1,0)
,(2,3,1,1)
,(NULL,6,1,0)
^^^^
您可以使用许多其他表达式来 return NULL 值。
演示为 AUTO_INCREMENT 列提供 NULL 关键字,以及提供非 NULL 值的其他行:
CREATE TABLE foo
( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
, mi VARCHAR(5)
) ENGINE=INNODB;
;
INSERT INTO foo (id, mi) VALUES
(1,'1')
,(NULL,'too')
;
-- 2 row(s) affected
INSERT INTO foo (id, mi) VALUES
(1,'one')
,(NULL,'three')
,(2,'two')
ON DUPLICATE KEY
UPDATE mi = VALUES(mi)
;
-- 5 row(s) affected
SELECT * FROM foo
;
-- id mi
-- --- ------
-- 1 one
-- 2 two
-- 3 three
我想向我的关系 table 添加行,其中将更新旧行并添加新行。这是我的查询(ID 是唯一的键):
INSERT INTO table_rel (ID, player, team, status) VALUES (1,1,1,0), (2,3,1,1)
ON DUPLICATE KEY UPDATE status=VALUES(status);
在应该创建的行中用什么代替 ID?例如。 (false,2,1,1)
你不知道。有:
INSERT INTO table_rel (ID, player, team, status) ...
您承诺提供所有列出的值。然后用
... VALUES (1,1,1,0), (2,3,1,1)
ON DUPLICATE KEY UPDATE status=VALUES(status);
您提供的是实际值,ID
包括在内(即使是新条目)。在这种情况下,如果没有任何 ID=1
或 ID=2
条目将被创建,否则对于重复键 value
将被覆盖。
另一种解决方案,如果您不想为新条目指定键,则必须使用不同的语句(注意缺少的列):
INSERT INTO table_rel (player, team, status) VALUES (1,1,0), (3,1,1)
假设 table_rel
在 ID
上有 AUTO_INCREMENT
选项(以防万一:ALTER TABLE table_rel MODIFY ID INTEGER NOT NULL AUTO_INCREMENT;
)。
更新:
依靠 AUTO_INCREMENT
你可以提供一个 NULL
密钥,让引擎为你生成一个新密钥。有关更完整的说明,请参阅
如果这是 AUTO_INCREMENT 列,您可以提供 NULL
值。
最简单的方法是关键字 NULL
INSERT INTO table_rel (ID, player, team, status) VALUES
(1,1,1,0)
,(2,3,1,1)
,(NULL,6,1,0)
^^^^
您可以使用许多其他表达式来 return NULL 值。
演示为 AUTO_INCREMENT 列提供 NULL 关键字,以及提供非 NULL 值的其他行:
CREATE TABLE foo
( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
, mi VARCHAR(5)
) ENGINE=INNODB;
;
INSERT INTO foo (id, mi) VALUES
(1,'1')
,(NULL,'too')
;
-- 2 row(s) affected
INSERT INTO foo (id, mi) VALUES
(1,'one')
,(NULL,'three')
,(2,'two')
ON DUPLICATE KEY
UPDATE mi = VALUES(mi)
;
-- 5 row(s) affected
SELECT * FROM foo
;
-- id mi
-- --- ------
-- 1 one
-- 2 two
-- 3 three