考虑
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
如果a和b是UNIQUE
字段时,发生上a = 1 OR b = 2
UPDATE
。当条件a = 1 OR b = 2
由两个或多个条目满足时,更新只完成一次。
防爆这里表表编号和名称UNIQUE
领域
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
违反标识和名称的唯一性。现在,随着
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
行为是下面的
在ON DUPLICATE KEY UPDATE
UPDATE
如果UNIQUE
场的一等于要插入的值进行。这里,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
因为没有重复的(两个键)被发现。
如果你有两列主键的表,并要与对重复重点工作,必须避免添加唯一索引的PK列,因为这将更新,如果pk1或pk2存在于值中。 – jloria 2014-10-31 06:27:28
有没有什么办法在第二列上有一个唯一的约束,但有它,所以它不会影响这个重复的键更新操作?这意味着如果未满足唯一约束,则插入或更新失败。 – CMCDragonkai 2015-07-25 12:24:54