问题说明:
今天从oracle迁移数据到mysql碰到个需求:原先的主键字段需要改成mysql中的自增字段,而且原先数据的值不能变,以后新插入的值从原先数据最大的值开始自增。
解决办法:
构建环境:
mysql> CREATE TABLE test
-> (
-> id INT UNSIGNED NOT NULL PRIMARY KEY,
-> username VARCHAR(15) NOT NULL
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values(5,'test1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(8,'test2');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(4,'test3');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(100,'test4');
Query OK, 1 row affected (0.00 sec)
将主键改成自增字段:
mysql> alter table test change id id int AUTO_INCREMENT;
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
插入新数据:
mysql> insert into test(username) values('test6');
Query OK, 1 row affected (0.00 sec)
查看:
发现没问题,直接修改字段为自增序列就可以完成。
mysql> select * from test;
+-----+----------+
| id | username |
+-----+----------+
| 4 | test3 |
| 5 | test1 |
| 8 | test2 |
| 100 | test4 |
| 101 | test6 |
+-----+----------+
5 rows in set (0.00 sec)
问题延伸:
1、MySQL创建表以后,auto_increment的字段自增值是从1开始的,写入0会被当做null值处理从而写入当前最大值的下一个值(即表定义中auto_increment的值),如果要从0开始如何操作呢?
解决办法:
SET sql_mode='NO_AUTO_VALUE_ON_ZERO';
2、如何指定自增字段从哪个值开始增长,增长步长?
解决办法:
- auto_increment_offset:表示自增长字段从那个数开始,他的取值范围是1 … 65535
- auto_increment_increment:表示自增长字段每次递增的量,其默认值是1,取值范围是1 … 65535