考虑
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
多个键的行为如下
UPDATE
ON 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
因为没有找到重复项(在两个键上)。