“使用多字段键进行重复键更新”

时间:2012-08-28 02:43:49

标签: mysql unique-constraint

根据the docs

  

如果[ab列是唯一的,则INSERT相当于此UPDATE语句:

UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
     

如果a=1 OR b=2匹配多行,则只更新一行。通常,您应该尽量避免在具有多个唯一索引的表上使用ON DUPLICATE KEY UPDATE子句。

这很公平,但如果我把它作为唯一的关​​键怎么办?

PRIMARY KEY (`a`,`b`)

由于重复密钥同时依赖于两个字段,更新是否会可靠地影响发生重复的特定行,或者它是否与字段单独唯一一样?

2 个答案:

答案 0 :(得分:1)

假设您使用的是与示例中相同的查询,则无法使用重复键可靠地更新行。它仍会在数据顺序中找到具有任一匹配值的第一行。考虑下面的例子。

   a | b
1. 1 | 1
2. 1 | 2
3. 1 | 3
4. 1 | 4
5. 2 | 1
6. 2 | 2

查询UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;将更新第一行,而不是所需的第二行。所以简而言之,它就像列是独一无二的一样。

答案 1 :(得分:0)

如果on duplicate涉及将列定义为unique或primary,或者在unique或primary key中定义的SAME列,则insert ... on duplicate update ...语句将更新ALL所在的行此PK或唯一键中的列具有相同的值。

要回答您对G-Nugget答案的评论,只会更新第2行。

希望有所帮助; - )