我有一个带有列的基本表:
如果唯一列不存在,则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 insert和 Why does MySQL autoincrement increase on failed inserts?
修复的想法?我是否可能以某种方式错误地构建了数据库?
******编辑****:似乎在你的my.ini文件中添加innodb_autoinc_lock_mode = 0修复了问题,但我有哪些选项可用于共享托管?
******编辑2 ******:好的,我认为我唯一的选择是将MyISAM更改为存储引擎。作为一个超级mySQL新手,我希望这不会导致很多问题。是吗?
答案 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的重复键功能与执行两个单独的查询完全相同,一个用于选择,一个用于更新所选记录或插入新记录。以编程方式执行此操作同样快,并且将来可以防止此问题,并使您的代码更具可移植性。