b) 针对某表:
CREATE TABLE 加上 AUTO_INCREMENT=n
or
ALTER TABLE AUTO_INCREMENT=n
如果表是非MyISAM或InnoDB引擎,则可以这样:
插入具有序列值n-1的“假”行,然后在插入了一行或多行“真”数据后删除这个“假”行。
3. AUTO_INCREMENT 其他应用场景:
1) 复合主键:
昆虫采集表:
CREATE TABLE bug
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL, # type of bug
date DATE NOT NULL, # date collected
origin VARCHAR(30) NOT NULL, # where collected
PRIMARY KEY (name, id)
);
插入一些数据,然后使用 order by 查询表中数据,可以看到MySQL为每一个唯一的name值创建了一个独立的序列:
mysql> SELECT * FROM bug ORDER BY name, id;
+----+-----------+------------+-------------------+
| id | name | date | origin |
+----+-----------+------------+-------------------+
| 1 | ant | 2006-10-07 | kitchen |
| 2 | ant | 2006-10-07 | front yard |
| 3 | ant | 2006-10-07 | front yard |
| 4 | ant | 2006-10-11 | garden |
| 1 | beetle | 2006-10-07 | basement |
| 2 | beetle | 2006-10-08 | front yard |
| 1 | cricket | 2006-10-08 | garage |
| 2 | cricket | 2006-10-10 | basement |
| 3 | cricket | 2006-10-11 | garden |
| 1 | honeybee | 2006-10-08 | back yard |
| 2 | honeybee | 2006-10-11 | garden |
| 1 | millipede | 2006-10-07 | basement |
| 1 | termite | 2006-10-09 | kitchen woodwork |
| 2 | termite | 2006-10-11 | bathroom woodwork |
+----+-----------+------------+-------------------+
2) 计数器:
采用一个计数器占用一行的序列生成机制。
INSERT语句中加上 ON DUPLICATE KEY UPDATE
例:
INSERT INTO tbl (col, num) VALUES('test', LAST_INSERT_ID(n))
ON DUPLICATE KEY UPDATE num = LAST_INSERT_ID(num+n);
3) 循环序列:
使用 division 和 modulo 操作符生成循环元素。
业务场景:
假设你正在生产药品或汽车零件,你必须通过批号跟踪所有商品,如果以后发现了产品问题,要求召回售出的某一批产品。假设你把12个产品包装为1盒,6盒包装为1箱。
这种情况下,产品编号为3个部分:单品编号(1到12)、盒编号(1到6)、1个批号(从1到任意值)。
根据序列编号生成箱、盒和单品编号的公式如下:
unit_num = ((seq - 1) % 12) + 1
box_num = (int ((seq - 1) / 12) % 6) + 1
case_num = int ((seq - 1)/(6 * 12)) + 1
下表说明了序列值与对应的箱、盒、单品编号之间的关系:
seq |
case |
box |
unit |
1 |
1 |
1 |
1 |
12 |
1 |
1 |
12 |
13 |
1 |
2 |
1 |
72 |
1 |
6 |
12 |
73 |
2 |
1 |
1 |
144 |
2 |
6 |
12 |
4. Oracle MySQL 的 sequence 和 AUTO_INCREMENT 互转:
MySQL---ORACLE序列解决方案
MySQL全局序列的实现方式(待实践研究):
1) sequence表:缺点:可能会成为性能瓶颈。
2) Flickr:与sequence表方式类似,但较好地解决了性能瓶颈和单点问题。