sql - 如何为我拥有的表创建一个upsert?

时间:2013-01-18 16:36:03

标签: mysql

我有这张桌子:

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

谢谢!

1 个答案:

答案 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)没有指定检查这些唯一约束的顺序。 (它可能因存储引擎而异。)