2012-02-08 107 views
17

我有列的基本表:與對重複密鑰更新太多的汽車增量

  • ID(初級與AI)
  • 名(唯一)

如果獨特的列不存在,插入行,否則更新該行....

INSERT INTO pages (name, etc) 
VALUES 
    'bob', 
    'randomness' 
ON DUPLICATE KEY UPDATE 
name = VALUES(name), 
etc = VALUES(etc) 

問題是如果它執行UPDATE,id列上的auto_increment值會上升。所以如果執行了一大堆更新,id auto_increment會經歷屋頂。

顯然,這是一個錯誤:http://bugs.mysql.com/bug.php?id=28781

...但我在共享主機使用的是InnoDB在MySQL 5.5.8。

具有無解多年前問題的其他人: prevent autoincrement on MYSQL duplicate insertWhy does MySQL autoincrement increase on failed inserts?

理念上的解決?我可能會以某種方式錯誤地構建數據庫嗎?

******編輯****:它似乎將innodb_autoinc_lock_mode = 0添加到您的my.ini文件可修復此問題,但是我有哪些共享主機選項?

****** EDIT 2 ******:好的,我想我唯一的選擇是換成MyISAM作爲存儲引擎。作爲一個超級mySQL新手,我希望這不會造成很多問題。是嗎?

+0

的一個大問題是,它不支持數據庫關係的定義。 InnoDB確實支持這一點。 – bakkerjoeri 2012-08-04 00:20:43

+2

innodb_autoinc_lock_mode = 0爲我工作。謝謝 – 2013-04-06 18:41:37

+0

我切換到Aria(MariaDB中的MyISAM),它可以防止auto_increment – DanFromGermany 2013-06-20 11:53:20

回答

12

我不認爲有一種方法可以繞過INSERT ... ON DUPLICTE KEY UPDATE的這種行爲。

但是,您可以把兩種說法,一個UPDATE和一個INSERT,在一個transaction:於MyISAM

START TRANSACTION ; 

UPDATE pages 
SET etc = 'randomness' 
WHERE name = 'bob' ; 

INSERT INTO pages (name, etc) 
SELECT 
     'bob' AS name 
    , 'randomness' AS etc 
FROM dual 
WHERE NOT EXISTS 
     (SELECT * 
     FROM pages p 
     WHERE p.name = 'bob' 
    ) ; 

COMMIT ; 
+0

謝謝你。我最終走上了這條路。該自動增量問題是一個痛苦的屁股。不需要「AS名稱」和「AS等」部分。 – 2012-02-08 10:30:45

+0

不,這些別名確實不需要。 – 2012-02-08 10:43:01

+0

@NathanWaters:添加了關於事務的MySQL文檔的鏈接。 – 2012-02-08 11:54:10

-3

MySQL的重複鍵功能與執行兩個單獨的查詢完全相同,一個用於選擇,一個用於更新所選記錄或插入新記錄。以編程方式執行此操作的速度同樣快,並且可以防止將來出現此問題,並使代碼更加便於攜帶。

+3

根據我所看到的,它幾乎沒有那麼快 – 2013-09-27 13:03:21