我有这张桌子:
create table comment_check (
record_id int ( 10 ) unique not null AUTO_INCREMENT ,
member_id int (10) not null unique ,
has_question_comment bool ,
has_business_comment bool
);
这个upsert:
INSERT INTO comment_check
(member_id , has_question_comment )
VALUES
(4815162342, 1 )
ON DUPLICATE KEY UPDATE
has_question_comment = 1
但令我困惑的是我有两个键,record_id和member_id是真正的键。当我创建表时,我应该将member_id列标记为键吗?我如何区分查询中的两个键(member_id和record_id)?
谢谢!
答案 0 :(得分:1)
没有必要区分它们。
无论哪个密钥抛出“重复密钥”异常都将是MySQL用于更新的异常。
在您的情况下,由于您没有为record_id
列提供值,并且该列被定义为AUTO_INCREMENT,因此MySQL将为该列生成唯一值。因此,您的语句不可能在record_id列上导致“重复键”异常。
将抛出重复键异常的“member_id”列,因此MySQL将执行相当于以下的更新:
UPDATE comment_check
SET has_question_comment = 1
WHERE member_id = 4815162342
实际上,在语句中为member_id提供的值可能会被解释为2147483647,因为该值超过了INT的最大值。
在更一般的情况下,任何一列都会抛出重复的键异常,例如
INSERT INTO comment_check (record_id, member_id) VALUES (101,1111),(202,2222);
INSERT INTO comment_check (record_id, member_id) VALUES (101,2222)
ON DUPLICATE KEY UPDATE has_question_comment = 1
两列中的任何一列都可以抛出“重复键”异常,行为(AFAIK)没有很好地定义哪个行会更新,无论是否:
... WHERE record_id = 101
-OR -
... WHERE member_id = 2222
我认为这取决于首先抛出的错误。并且MySQL规范(AFAIK)没有指定检查这些唯一约束的顺序。 (它可能因存储引擎而异。)