根据the docs:
如果[
a
和b
列是唯一的,则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`)
由于重复密钥同时依赖于两个字段,更新是否会可靠地影响发生重复的特定行,或者它是否与字段单独唯一一样?
答案 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行。
希望有所帮助; - )