如何插入用新旧行更新duplucate密钥?

goucqfw6  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(297)

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

6fe3ivhb

6fe3ivhb1#

如果这是一个自动增量列,您可以提供一个 NULL 价值观。最简单的方法是使用关键字null

INSERT INTO table_rel (ID, player, team, status) VALUES
  (1,1,1,0)
 ,(2,3,1,1)
 ,(NULL,6,1,0)
   ^^^^

有很多其他表达式可以用来返回空值。
演示如何为自动增量列提供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
3gtaxfhh

3gtaxfhh2#

你没有。使用:

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_relAUTO_INCREMENT 选项开启 ID (以防万一: ALTER TABLE table_rel MODIFY ID INTEGER NOT NULL AUTO_INCREMENT; ).
更新:依赖 AUTO_INCREMENT 你可以提供一个 NULL 并让引擎为您生成一个新密钥。有关更完整的描述,请参见斯宾塞7593的答案。

相关问题