开发者社区> 问答> 正文

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

使用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版本。

展开
收起
保持可爱mmm 2020-05-16 21:59:39 453 0
1 条回答
写回答
取消 提交回答
  • 您可以将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将很快,并且数据库无论如何都将必须执行该检查。

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

    2020-05-16 22:08:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像