多个UNIQUE字段的ON DUPLICATE KEY UPDATE的MySQL行为

kir*_*off 18 mysql upsert sql-update sql-insert

从MySQL 4.1.0开始,ON DUPLICATE KEY UPDATE当插入的值(带INSERTSETVALUES)已经在目标表wrt PRIMARY KEY或某个UNIQUE字段中时,可以添加语句来指定行为.如果PRIMARY KEY某个UNIQUE字段的值已经在表中,INSERT则替换为UPDATE.

  • ON DUPLICATE KEY UPDATE如果UNIQUE我的表中有多个字段,表现 如何?

  • 如果两个UNIQUE字段匹配,我可以只有一个更新吗?

  • 只有当两个UNIQUE字段同时匹配时才能更新吗?

kir*_*off 25

考虑

INSERT INTO table (a,b,c) VALUES (1,2,3)
    -> ON DUPLICATE KEY UPDATE c=c+1;
Run Code Online (Sandbox Code Playgroud)

如果a和b是UNIQUE字段,则UPDATE发生在a = 1 OR b = 2.此外,当a = 1 OR b = 2两个或多个条目满足条件时,更新只进行一次.

此处包含Id和Name UNIQUE字段的表格表

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6
Run Code Online (Sandbox Code Playgroud)

如果查询是

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
Run Code Online (Sandbox Code Playgroud)

然后我们得到

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6
1      C        7
Run Code Online (Sandbox Code Playgroud)

这违反了Id和Name的唯一性.现在用

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7
Run Code Online (Sandbox Code Playgroud)

我们得到

Id     Name     Value 
1      P        7 
2      C        7 
3      D        29 
4      A        6
Run Code Online (Sandbox Code Playgroud)

多个键上的行为如下

UPDATEON DUPLICATE KEY UPDATE如果其中一个UNIQUE字段等于要插入的值,则执行in .在这里,UPDATE执行Id = 1 OR Name = C.它相当于

UPDATE table 
SET Value = 7
WHERE Id = 1 OR Name = C
Run Code Online (Sandbox Code Playgroud)

如果我只想要一个更新,对于任一键,该怎么办?

可以使用UPDATELIMIT关键字的语句

UPDATE table 
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

哪个会给

Id     Name     Value 
1      P        7 
2      C        3 
3      D        29 
4      A        6
Run Code Online (Sandbox Code Playgroud)

如果仅在两个键的值匹配时才需要更新,该怎么办?

一种解决方案是ALTER TABLE使PRIMARY KEY(或唯一性)在两个领域都有效.

ALTER TABLE table 
DROP PRIMARY KEY
ADD PRIMARY KEY (Id, Name);
Run Code Online (Sandbox Code Playgroud)

从今起

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7
Run Code Online (Sandbox Code Playgroud)

我们得到

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6
1      C        7
Run Code Online (Sandbox Code Playgroud)

因为没有找到重复(在两个键上).

  • 有没有办法在第二列上有一个唯一约束,但它有不会影响这个重复键更新操作?这意味着如果不满足唯一约束,则插入或更新将失败. (2认同)