二十五岁时我们都一样愚蠢、多愁善感,喜欢故弄玄虚,可如果不那样的话,五十岁时也就不会如此明智。
标题:SQL AUTO INCREMENT 关键词
AUTO INCREMENT
会在新记录插入表中时生成一个唯一的数字
AUTO INCREMENT
一般用在CREATE TABLE
语句中,指定某一列的值会自动自增但是,不同的数据库系统对于
AUTO INCREMENT
实现各不相同,我们先拿最熟悉的 MySQL 来说吧演示数据
先在 MySQL 数据库运行下面的语句创建测试数据
CREATE DATABASE IF NOT EXISTS twle default character set utf8mb4 collate utf8mb4_unicode_ci; USE twle; DROP TABLE IF EXISTS `lession`;创建表时指定某列自增
比如我们之前创建
lession
表时的语句CREATE TABLE `lession` ( id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, name varchar(32) default '', views int(11) NOT NULL default '0', created_at DATETIME );它指定了
id
列会自动自增,自动从1
开始自增比如我们可以使用下面的语句插入两条记录
INSERT INTO lession(name,views,created_at) VALUES ('Python 基础教程',981,'2017-04-18 13:52:03'), ('Scala 基础教程',73,'2017-04-18 16:03:32');然后我们可以使用
SELECT * FROM lession;
查看表中的数据mysql> SELECT * FROM lession; +----+---------------------+-------+---------------------+ | id | name | views | created_at | +----+---------------------+-------+---------------------+ | 1 | Python 基础教程 | 981 | 2017-04-18 13:52:03 | | 2 | Scala 基础教程 | 73 | 2017-04-18 16:03:32 | +----+---------------------+-------+---------------------+我们可以看到,第一次插入,
id
值被赋值为1
,第二次插入的时候自动自增了1
如果想要让
AUTO INCREMENT
序列以其它的值起始,可以使用下面的 SQL 语句修改表ALTER TABLE lession AUTO_INCREMENT=80;运行结果如下
mysql> ALTER TABLE lession AUTO_INCREMENT=80; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0这时候我们再插入一条数据
INSERT INTO lession(name,views,created_at) VALUES ('Ruby 基础教程',199,'2017-05-01 06:16:14');表中的数据就会时这样的
mysql> SELECT * FROM lession; +----+---------------------+-------+---------------------+ | id | name | views | created_at | +----+---------------------+-------+---------------------+ | 1 | Python 基础教程 | 981 | 2017-04-18 13:52:03 | | 2 | Scala 基础教程 | 73 | 2017-04-18 16:03:32 | | 80 | Ruby 基础教程 | 199 | 2017-05-01 06:16:14 | +----+---------------------+-------+---------------------+当然了,我们可以在创建表时就修改自增的起始值
DROP TABLE IF EXISTS `lession`; CREATE TABLE `lession` ( id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, name varchar(32) default '', views int(11) NOT NULL default '0', created_at DATETIME )AUTO_INCREMENT=80; INSERT INTO lession(name,views,created_at) VALUES ('Python 基础教程',981,'2017-04-18 13:52:03'), ('Scala 基础教程',73,'2017-04-18 16:03:32'), ('Ruby 基础教程',199,'2017-05-01 06:16:14');使用
SELECT * FROM lession;
运行结果如下mysql> SELECT * FROM lession; +----+---------------------+-------+---------------------+ | id | name | views | created_at | +----+---------------------+-------+---------------------+ | 80 | Python 基础教程 | 981 | 2017-04-18 13:52:03 | | 81 | Scala 基础教程 | 73 | 2017-04-18 16:03:32 | | 82 | Ruby 基础教程 | 199 | 2017-05-01 06:16:14 | +----+---------------------+-------+---------------------+SQL Server 中的 AUTO INCREMENT
SQL Server 中没有
AUTO INCREMENT
关键字,取而代之的是IDENTITY()
函数
IDENTITY()
函数的原型是IDENTITY(start,step)
参数 说明 start 自增时的初始值 step 自增步长 比如我们可以使用下面的 SQL 语句创建
lession
表,指定id
列从1
开始,每次自增1
CREATE TABLE `lession` ( id int(11) NOT NULL IDENTITY(1,1) PRIMARY KEY , name varchar(32) default '', views int(11) NOT NULL default '0', created_at DATETIME );Access 中的 AUTO INCREMENT
Access 中没有
AUTO INCREMENT
关键字,取而代之的是AUTOINCREMENT()
函数
AUTOINCREMENT()
函数的原型是AUTOINCREMENT(start=1,step=1)
参数 说明 start 自增时的初始值,默认为 1 step 自增步长,默认为 1 比如我们可以使用下面的 SQL 语句创建
lession
表,指定id
列从1
开始,每次自增1
CREATE TABLE `lession` ( id int(11) NOT NULL AUTOINCREMENT PRIMARY KEY , name varchar(32) default '', views int(11) NOT NULL default '0', created_at DATETIME );更有趣的,如果使用默认值,就连括号
()
都可以省略,就像上面一样Oracle 中的 AUTO INCREMENT
Access 中没有
AUTO INCREMENT
关键字,取而代之的是sequence
对象
sequence
对象用于生成数字序列
Oracle
中实现一个字段的自增需要以下几步:
使用
CREATE SEQUENCE
创建自增序列CREATE SEQUENCE seq_lession MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10上面的代码创建一个名为 seq_lession 的 sequence 对象,它以 1 起始且以 1 递增
该对象缓存 10 个值以提高性能
cache 选项规定了为了提高访问速度要存储多少个序列值
使用
nextval()
函数从 seq_lession 序列中取回下一个值,然后插入数据到表中INSERT INTO lession (id,name,views, created_at)VALUES (seq_lession.nextval,'Python 基础教程',981,'2017-04-18 13:52:03');上面的 SQL 语句会在 "lession" 表中插入一条新记录
"id" 列会被赋值为来自 seq_person 序列的下一个数字