使用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将很快,并且数据库无论如何都将必须执行该检查。
但是,这种方法不适用于第一个标签。您可以在标签表中植入您认为最终将被使用的标签,也可以对空表进行单独检查。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。