2012-02-27 80 views
1

我有我的指數設置到外地:testsuite_id,我執行以下查詢:MySQL的重複鍵更新問題

INSERT INTO testsuite_dates (testsuite_id,start_date,end_date) 
VALUES ('27798','2012:02:27 00:00:00','2012:02:28 00:00:00') 
ON DUPLICATE KEY UPDATE testsuite_id='27798'; 

我希望如果存在testsuite_id條目此更新條目或插入如果它不是,但如果我第二次執行此查詢,它會插入第二個具有相同testsuite_id的條目。

我錯過了什麼?

回答

3

「關於重複鍵更新」只改變你的「更新」部分指定的字段。您只更新關鍵字段,這首先觸發了約束違規。其他領域默默放棄,所以你很有效做update yourtable set id=id where id=xxx

你必須列出要更新的每個字段:

INSERT INTO testsuite_dates (testsuite_id,start_date,end_date) 
VALUES ('27798','2012:02:27 00:00:00','2012:02:28 00:00:00') 
ON DUPLICATE KEY UPDATE 
    start_date=values(start_date), end_date=values(end_date) 

注意在更新部分使用values()功能。這允許您引用已插入的NEW值,並將其用於更新部分。這樣可以避免在同一查詢中兩次嵌入相同的數據。對於幾個日期或數字不是什麼大問題,但是如果你插入大塊,它會節省大量的查詢字符串。

+0

我沒有意識到我必須通過相同的值兩次(起始日期和結束日期)。我想我是指定索引ID來插入/更新。這工作,謝謝! – user1216398 2012-02-27 19:38:12

4

然後,您在testsuite_id上沒有PRIMARY或UNIQUE鍵。

0

做您設置testsuite_id是一個主鍵,或具有唯一約束

+0

testsuite_id被設定爲是唯一的 – user1216398 2012-02-27 19:35:06

0
INSERT INTO testsuite_dates (testsuite_id,start_date,end_date) 
VALUES ('27798','2012:02:27 00:00:00','2012:02:28 00:00:00') 
ON DUPLICATE KEY UPDATE testsuite_id=testsuite_id+1;