怎么做INSERT ... ON DUPLUCATE KEY UPDATE用新旧行?

时间:2016-10-06 22:43:14

标签: mysql insert-update

我想在我的关系表中添加行,其中将更新旧行并添加新行。这是我的查询(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)

2 个答案:

答案 0 :(得分: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=1ID=2条目将被创建,否则重写密钥value将被覆盖。

另一种解决方案如果您不想为新条目指定密钥,则必须使用其他语句(请注意缺少的列):

INSERT INTO table_rel (player, team, status) VALUES (1,1,0), (3,1,1)

前提是table_rel AUTO_INCREMENT上有ID选项(以防万一:ALTER TABLE table_rel MODIFY ID INTEGER NOT NULL AUTO_INCREMENT;)。

<强>更新 依靠AUTO_INCREMENT,您可以提供NULL密钥,让引擎为您生成新密钥。有关更完整的说明,请参阅spencer7593's answer

答案 1 :(得分:1)

如果是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)
   ^^^^

您可以使用许多其他表达式来返回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