当前位置: 首页 > 面试题库 >

带有ON DUPLICATE KEY UPDATE的自动增量太多

姚洲
2023-03-14
问题内容

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

  • 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

…但是我在共享主机上在MySQL 5.5.8上使用InnoDB。

几年前其他人还没有解决方案的问题:
防止MYSQL重复插入自动增加,
为什么失败插入MySQL自动增加?

修复思路?我是否可能以某种方式不正确地构造了数据库?

** EDIT **:似乎在您的my.ini文件中添加了innodb_autoinc_lock_mode =
0可以解决此问题,但是对于共享托管我有哪些选择?

** EDIT 2
****:好的,我认为我唯一的选择是更改为MyISAM作为存储引擎。作为一个大型的mySQL新手,我希望不会引起很多问题。是啊


问题答案:

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

但是,您可以在一个事务中放入两个语句,一个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 ;


 类似资料:
  • 我正在使用java中的MySQL库执行一个查询。在我的数据库结构中,有一列名为(主键,非空且自动递增)。通常在每次插入查询中,我都将值设置为,在查询执行后,它会增加最后一个id,但在java中这样做会给我异常。 这就是代码: 如何使用自动增量ID执行查询?

  • 问题内容: 我希望自己的复合关键元素之一自动递增,并且我将Embedded Key用于实体类,因此由于使用或时注释会被忽略,因此我无法使用“生成的值注释”来解决问题。 问题答案: 您不能使用与,或,在注释被忽略。 您必须手动分配值。 检查以下参考: https://java.net/jira/browse/GLASSFISH-13567 https://forums.hibernate.org/v

  • 问题内容: 我尝试使用自动增量ID和“默认日期”字段创建MS Access表,但下一个查询始终显示“ CREATE TABLE语句中的语法错误。”: 谁可以帮助我解决该查询。谢谢! 问题答案: Ms-Access中有很多类型,因此您必须具体。我想你要。 该语法要求: 您也可以在一个语句中包含这两个语句: 最好的做法是在每张桌子上都有一个,而您可能打算将其用于: 一个页面,其中包含有关如何使用SQL

  • 问题内容: 使用Postgres,我试图用SQL自动编号主键。但是,这给了我一个错误。 错误: 知道为什么吗? 问题答案: Postgres 10或更高版本 列(请参见下文)保持不变。但是考虑一个 专栏。Postgres10实现了此标准SQL功能。 手册中的基本语法和信息。 __用列 创建 表 将 列 添加 到现有表 表可能填充也可能不填充行。 同时使它成为PK(表还不能拥有PK): 有关的: 如

  • 这就是我所拥有的 当程序运行时,会出现一个添加新类别的屏幕,用户必须写入类别的名称和描述,但ID应该是自动的,并且应该在每次用户输入新类别时增加ID。我这样做并没有达到预期效果,它只增加了一次,但由于初始值保持在5,所以它总是6。

  • 问题内容: 我正在使用php和mysql。我有一个表,其中id列设置为自动递增作为主键。我正在尝试添加另一个名为sort_order的列。插入行后,sort_order列应自动递增。然后,用户将能够更改sort_order值。但是mysql不允许多于一列的自动递增? 自动递增sort_order值的最佳方法是什么? 受欢迎的要求,更多的解释。 在管理区域中,用户将具有类别列表。用户可以使用java