sql设置id自动增长
在MySQL里给主键加上`AUTO_INCREMENT`,置id自就能让数据库自己管编号。动增这事儿简单到一句话能说完,置id自但真用起来,动增坑也不少。置id自
建表的动增时候这么写:
CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY (id) ); 关键是那行`AUTO_INCREMENT`,它告诉MySQL:这列你别管了,置id自我来填。动增每次插入新行,置id自id自动加1。动增1、置id自2、动增3、置id自4……看着挺顺,动增对吧?置id自其实这里头有个隐藏细节——它从1开始,但如果你删了id=3那行,再插新数据,id直接跳到5。不是3,是5。因为自增计数器不会回头。
这设计挺合理,避免并发插入时撞号。可有些人第一次遇到就懵了,以为数据库坏了。其实没坏,这就是自增的本性。
想改起始值?建表时加个参数:
CREATE TABLE orders ( order_id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (order_id) ) AUTO_INCREMENT = 1000; 从1000开始,订单号带个前缀感,看着专业。老表想改起始值也容易:
ALTER TABLE orders AUTO_INCREMENT = 2000; 但这命令有个脾气——如果表里已有数据,你设的起始值不能小于当前最大id+1。比如最大id是1500,你想设成1000,MySQL直接忽略,还是按1501往下走。它不会报错,就是不理你。
再说个实际案例。前阵子我帮朋友调一个电商后台,他们的商品表id用自增,结果运营手动往表里插了几条测试数据,id直接飙到五位数。后来上线正式数据,商品编号长得跟乱码似的。解决办法?清掉测试行,然后跑一句:
ALTER TABLE products AUTO_INCREMENT = 1; 前提是表里不能有比1大的id。要是已经混进去了,就得先删数据或者改id,麻烦得很。所以生产环境里,别手贱去动自增列的值。
还有个常见误区:有人以为自增必须配主键。其实不是,你可以给普通列加自增,但MySQL要求它是索引列。大多数情况下,还是老老实实配主键,省心。
要是用PostgreSQL,玩法又不一样,它用`SERIAL`或者`IDENTITY`,自增逻辑跟MySQL略有区别。但核心思想一样——让数据库管编号,别让应用层操心。
最后说个冷知识。MySQL 8.0以后,自增计数器是持久化的。以前版本重启服务后,计数器可能重置,导致id复用,引发诡异bug。现在不会了,重启后接着上次的编号走。这改动看着小,实际救了不少人。
自增id这功能,属于那种“平时感觉不到存在,出问题才想起它”的东西。设置不难,难的是理解它的脾气。记住两件事:删行不会让编号回头;手动改自增列值要格外小心。做到这两点,基本就稳了。
(责任编辑:探索)














