一尘不染

防止在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版本。


阅读 200

收藏
2020-05-17

共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将很快,并且数据库无论如何都将必须执行该检查。

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

2020-05-17