2013-05-04 55 views
16

从MySQL 4.1.0起密钥更新,可以添加ON DUPLICATE KEY UPDATE语句中指定的行为,当值插入(与INSERTSETVALUES)已经在目标表w.r.t. PRIMARY KEY或一些UNIQUE字段。如果PRIMARY KEY或某个UNIQUE字段的值已在表格中,则INSERT将替换为UPDATEMySQL的行为式两份多个独特的领域

  • 如何ON DUPLICATE KEY UPDATE的行为的情况下,也有我的表中多个 UNIQUE领域?

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

  • 只有同时匹配UNIQUE两个字段,我才可以进行更新吗?

回答

20

考虑

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

如果a和b是UNIQUE字段时,发生上a = 1 OR b = 2UPDATE。当条件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 UPDATEUPDATE如果UNIQUE场的一等于要插入的值进行。这里,UPDATEId = 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 

因为没有重复的(两个键)被发现。

+1

如果你有两列主键的表,并要与对重复重点工作,必须避免添加唯一索引的PK列,因为这将更新,如果pk1或pk2存在于值中。 – jloria 2014-10-31 06:27:28

+2

有没有什么办法在第二列上有一个唯一的约束,但有它,所以它不会影响这个重复的键更新操作?这意味着如果未满足唯一约束,则插入或更新失败。 – CMCDragonkai 2015-07-25 12:24:54

0
  1. 如何MySQL的行为...... 它的表现不如预期,这是执行对重复KEY子句。

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

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

  3. 请参阅第2