自动增长
自动增长:auto_increment,当给定某个字段该属性之后,该列的数据在没有提供确定数据的时候,系统会根据之前已经存在的数据进行自动增加,填充数据。
通常自动增长用于逻辑主键
自动增长的原理
1、在系统中有维护一组数据,用来保存当前使用了自动增长属性的字段,记住当前对应的数据值,再给定一个指定的步长
2、当用户进行数据插入的时候,如果没有给定值,系统在原始值上再加上步长变成新的数据
3、自动增长的触发,给定属性的字段没有提供值
4、自动增长只适用于数值
使用自动增长
基本语法:在字段之后增加一个属性 auto_increment
mysql> create table auto_incre(
-> id int primary key auto_increment,
-> name varchar(10) not null comment '用户名',
-> password varchar(10) not null comment '密码'
-> )charset=utf8;
Query OK, 0 rows affected (1.87 sec)插入数据:null触发自动增长,不能给定具体值
mysql> insert into auto_incre values(null,'jack','123456');
Query OK, 1 row affected (0.35 sec)
mysql> select * from auto_incre;
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | jack | 123456 |
+----+------+----------+
1 row in set (0.00 sec)修改自动增长
1、查看自增长,自增长一旦触发使用之后,会自动的在表选项中增加一个选项,因此一张表最多只能拥有一个自增长。
2、表选项可以通过修改表结构来实现。
alter table 表名 auto_increment =值
mysql> alter table auto_incre auto_increment=9;
Query OK, 1 row affected (1.82 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> show create table auto_incre;
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| auto_incre | CREATE TABLE `auto_incre` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL COMMENT '用户名',
`password` varchar(10) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)增加/删除自动增长
删除自增长:就是在字段属性之后不再保留auto_increment,当用户修改自增长所在的字段时,如果没有看到auto_increment属性,系统会自动清除该自增长。
alter table 表名 modify 字段 字段新属性 (切记不要再增加primary key属性,因为查看表的创建语句查看表结构时,主键已被放入额外一行存储)
mysql> alter table auto_incre modify id tinyint;
Query OK, 1 row affected (0.19 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> show create table auto_incre;
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| auto_incre | CREATE TABLE `auto_incre` (
`id` tinyint(4) NOT NULL DEFAULT '0',
`name` varchar(10) NOT NULL COMMENT '用户名',
`password` varchar(10) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)初始设置
在系统中有一组变量用来维护自增长的初始值和步长
show variables like 'auto_increment%'
mysql> show variables like 'auto_increment%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
2 rows in set (0.00 sec)auto_increment_increment 步长
auto_increment_offset 初始值
细节问题
1、一张表只有一个自增长,因为自增长会上升到表选项中
2、如果数据插入中没有触发自增长(给定了数据),那么自增长不会表现(虽然自增长没有表现,但是默默根据当前用户设定的值来初始化了下一个值)
3、自增长修改的时候,值可以较大,但是不能比当前已有的自增长字段的值小
mysql> insert into auto_incre values(6,'Lily',13579);
Query OK, 1 row affected (1.60 sec)
mysql> insert into auto_incre values(5,'Tom',246810);
Query OK, 1 row affected (0.00 sec)
mysql> select * from auto_incre;
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | jack | 123456 |
| 6 | Lily | 13579 |
| 5 | Tom | 246810 |
+----+------+----------+
3 rows in set (0.10 sec)
-- 插入的数值比修改的数值(9)小,自增长数值依然是9
mysql> show create table auto_incre;
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| auto_incre | CREATE TABLE `auto_incre` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL COMMENT '用户名',
`password` varchar(10) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> insert into auto_incre values(15,'Dary',123123);
Query OK, 1 row affected (0.00 sec)
-- 插入数值大于9,根据用户设定值初始化下一个数值为16
mysql> show create table auto_incre;
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| auto_incre | CREATE TABLE `auto_incre` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL COMMENT '用户名',
`password` varchar(10) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter table auto_incre auto_increment=12;
Query OK, 4 rows affected (0.51 sec)
Records: 4 Duplicates: 0 Warnings: 0
-- 修改自增长数值时,因为12<16,所以改变不了它的值,依然是16
mysql> show create table auto_incre;
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| auto_incre | CREATE TABLE `auto_incre` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL COMMENT '用户名',
`password` varchar(10) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)