ON DUPLICATE KEY UPDATE的自动增量太多

时间:2012-02-08 07:07:00

标签: mysql auto-increment on-duplicate-key

我有一个带有列的基本表:

  • id(主要使用AI)
  • 名称(唯一)

如果唯一列不存在,则INSERT该行,否则更新行....

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

问题是如果它执行UPDATE,则id列上的auto_increment值会上升。因此,如果执行了大量的UPDATES,则id auto_increment会通过屋顶。

显然这是一个错误:http://bugs.mysql.com/bug.php?id=28781

...但我在mySQL 5.5.8上使用InnoDB进行共享托管。

多年前没有解决问题的其他人: prevent autoincrement on MYSQL duplicate insertWhy does MySQL autoincrement increase on failed inserts?

修复的想法?我是否可能以某种方式错误地构建了数据库?

******编辑****:似乎在你的my.ini文件中添加innodb_autoinc_lock_mode = 0修复了问题,但我有哪些选项可用于共享托管?

******编辑2 ******:好的,我认为我唯一的选择是将MyISAM更改为存储引擎。作为一个超级mySQL新手,我希望这不会导致很多问题。是吗?

2 个答案:

答案 0 :(得分:12)

我认为没有办法绕过INSERT ... ON DUPLICTE KEY UPDATE的这种行为。

但是,您可以在一个transaction中添加两个语句,一个UPDATE和一个INSERT

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 ;

答案 1 :(得分:-3)

MySQL的重复键功能与执行两个单独的查询完全相同,一个用于选择,一个用于更新所选记录或插入新记录。以编程方式执行此操作同样快,并且将来可以防止此问题,并使您的代码更具可移植性。