2013-01-18 47 views
1

我有这个表:sql - 我如何创建一个表我有一个upsert?

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

用于['upsert'](https://www.google.com/search?q=define+upsert)的+1。从未听说过它。 – Kermit

+0

@njk谢谢,加上“upsert”听起来很酷:) – Genadinik

+0

其实这是一个很常见的词,至少在数据仓库的世界。 – fancyPants

回答

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 

无论是两列可以抛出一个“重复键”异常,行为(据我所知)没有很好地明确定义哪个行会得到更新,无论是其:

... WHERE record_id = 101 

- 或 -

... WHERE member_id = 2222 

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