22

从 MySQL 4.1.0 开始,当插入的值(使用or或)已经在目标表 wrt或某个字段中时,可以添加ON DUPLICATE KEY UPDATE语句来指定行为。如果值或某些字段已在表中,则替换为.INSERTSETVALUESPRIMARY KEYUNIQUEPRIMARY KEYUNIQUEINSERTUPDATE

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

  • UNIQUE如果任一字段匹配,我可以只更新一次吗?

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

4

2 回答 2

36

考虑

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

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

Ex here table table with Id 和 NameUNIQUE字段

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6

如果查询是

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);

然后我们得到

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6
1      C        7

这违反了 Id 和 Name 的唯一性。现在有了

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;

我们得到

Id     Name     Value 
1      P        7 
2      C        7 
3      D        29 
4      A        6

多个键的行为如下

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

UPDATE table 
SET Value = 7
WHERE Id = 1 OR Name = C;

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

可以使用带关键字UPDATE的语句LIMIT

UPDATE table 
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;

这会给

Id     Name     Value 
1      P        7 
2      C        3 
3      D        29 
4      A        6

如果仅当两个键的值都匹配时我想要一个更新怎么办

一种解决方案是ALTER TABLE使PRIMARY KEY(或唯一性)在两个领域都起作用。

ALTER TABLE table 
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);

从今起

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;

我们得到

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6
1      C        7

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

于 2013-05-04T19:06:12.830 回答
0
  1. MySQL 的行为如何......它的行为符合预期,即执行 ON DUPLICATE KEY 子句。

  2. 我可以有一个更新...实际上,您只有一个 ON DUPLICATE KEY 子句,因此您需要放置一些代码来区分涉及哪个约束。幸运的是,这是可能的。您唯一应该知道的是,分配的顺序很重要,您可以分配多次。假设您对 a 和 b 有唯一约束,并且仅在涉及唯一性时才想更新 c: ... KEY UPDATE c = IF(a = VALUES(a) and b <> VALUES(b), VALUES( c), c), b = 值(b)

    但是,如果您更改分配顺序,则 if 中的第二个条件将始终为 false。

  3. 见 2。

于 2013-05-04T22:34:16.963 回答