0

根据文档

如果 [columns aand bare] 是唯一的,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`)

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

4

2 回答 2

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;将更新第一行,而不是所需的第二行。因此,简而言之,就好像列是单独的一样。

于 2012-08-28T02:56:31.980 回答
0

如果 on duplicate 涉及一个列女巫被定义为唯一或主键,或者在唯一键或主键中定义的相同列集,则 insert ... on duplicate update ... 语句将更新所有列所在的行此 PK 或唯一键具有相同的值。

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

希望有帮助;-)

于 2012-08-28T03:12:25.367 回答