2013-01-18 86 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)沒有規定這些唯一約束被檢查的順序。 (根據存儲引擎可能有所不同。)