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

防止在MySQL重复插入上自动递增

罗鸿福
2023-03-14
问题内容

使用MySQL 5.1.49,我正在尝试实现一个标记系统,我的问题是有两列的表:id(autoincrement)tag(unique varchar) (InnoDB)

使用query时,即使忽略了插入INSERT IGNORE INTO tablename SET tag="whatever",自动增量id值也会增加。

通常,这不会有问题,但是我希望有很多尝试为该特定表插入重复项,这意味着我下id一个新行字段的值将跳得太多。

例如,我最终得到一个表,该表具有3行,但错误id的是

1   | test
8   | testtext
678 | testtextt

另外,如果我不做INSERT IGNORE而只是定期做INSERT INTO并处理错误,则自动递增字段仍会增加,因此下一个真正的插入仍然是错误的自动递增。

如果有INSERT重复的行尝试,有没有办法停止自动递增?

据我对MySQL
4.1的了解,该值不会增加,但我要做的最后一件事是要么SELECT提前做很多语句来检查标签是否存在,要么更糟糕的是降级我的MySQL版本。


问题答案:

您可以将INSERT修改为如下形式:

INSERT INTO tablename (tag)
SELECT $tag
FROM tablename
WHERE NOT EXISTS(
    SELECT tag
    FROM tablename
    WHERE tag = $tag
)
LIMIT 1

如果$tag您要添加的标签(正确地加上引号,或者当然是占位符)在哪里?如果标签已经存在,则该方法甚至不会触发INSERT(以及随后的自动增量浪费)。您可能会想出比这更好的SQL,但是以上方法可以解决问题。

如果您的表已正确索引,则用于存在性检查的额外SELECT将很快,并且数据库无论如何都将必须执行该检查。

但是,这种方法不适用于第一个标签。您可以在标签表中植入您认为最终将被使用的标签,也可以对空表进行单独检查。



 类似资料:
  • 问题内容: 如何防止在php mysql中输入重复记录?在插入表之前验证输入。 我目前正在为我的网站建立一个用户注册部分,但是如果在数据库中发现重复的用户名或电子邮件地址,我想向他们显示一个错误。 编辑 这是我到目前为止要插入的行…我将如何在这里实现这两个答案: 我猜我可以在if … else语句中实现所有功能吗? 问题答案: 我使用了sql语句以及if else语句。 然后 显示错误消息,以防止

  • 本文向大家介绍防止mysql重复插入记录的方法,包括了防止mysql重复插入记录的方法的使用技巧和注意事项,需要的朋友参考一下 防止mysql重复插入记录的方法有很多种,常用的是ignore,Replace,ON DUPLICATE KEY UPDATE,当然我们也可以在php中加以判断了。 方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免

  • 问题内容: 我目前在将主键设置为时遇到问题。它不断增加。 例如: 从上面的描述中,您会注意到我在该表中有3个输入,但是由于每次更新都会自动递增,因此第三个输入的ID为86。 反正有避免这种情况吗? 这是我的mySQL查询的样子: 这是我的桌子的样子; 问题答案: 您可以将config选项设置为“传统”自动增量锁定模式,以确保所有语句将为列分配连续的值。 也就是说,您不应该依赖于应用程序中自动递增I

  • 问题内容: 我了解存在和。但是,当有重复的键时,我想对临时表进行操作,以记录已违反的唯一键的记录,以便将其输出给用户。 有什么办法可以做吗?如果有帮助,我正在尝试进行批量插入。 问题答案: 使用,您不能插入到另一个表中-也没有可用的替代功能。 您可以通过两种自定义/替代方式来实现此目的: 使用对此问题的可接受答案中概述的:将MySQL ON DUPLICATE KEY插入到审计表或日志表中 创建一

  • 问题内容: 我想提出一种标准做法,以防止任何表在重要的地方重复。在大多数情况下,重复项是变量的组合而不是一个。我的主键只是每个字段的唯一ID,因此我无法使用它们。我一直在做的是先查询表,然后查询所要组合的行数是否为0,然后进行插入。但是,我已经读过,应该有可能在多个字段上设置唯一键以强制唯一性。INSERT IGNORE听起来很可能,但是,我需要在多个列上忽略它。 例如,对于字段关注者和关注对象,

  • 这是我的用户注册数据库的方式,但我的问题是:如何防止数据库具有相同用户名的副本,或者换句话说,如果用户名存在于数据库。