1

我有这张桌子:

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 
);

而这个更新:

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)?

谢谢!

4

1 回答 1

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

-或者-

   ... WHERE member_id = 2222

我相信这取决于首先抛出哪个错误。并且 MySQL 规范 (AFAIK) 没有指定检查这些唯一约束的顺序。(可能因存储引擎而异。)

于 2013-01-18T16:45:46.957 回答