登录 |  注册
首页 >  数据库 >  SQL >  SQL语句 之 序列

SQL语句 之 序列

序列是根据需要产生的一组有序整数:1, 2, 3 ... 序列在数据库中经常用到,因为许多应用要求数据表中的的每一行都有一个唯一的值,序列为此提供了一种简单的方法。

本节阐述在 MySQL 中如何使用序列。

使用 AUTO_INCREMENT 列

在 MySQL 中使用序列最简单的方式是,把某列定义为 AUTO_INCREMENT,然后将剩下的事情交由 MySQL 处理。

示例


 试一下下面的例子,该例将会创建一张新表,然后再里面插入几条记录,添加记录时并不需要指定记录的 ID,因为该列的值由 MySQL 自动增加。

mysql> CREATE TABLE INSECT
    -> (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> PRIMARY KEY (id),
    -> name VARCHAR(30) NOT NULL, # type of insect
    -> date DATE NOT NULL, # date collected
    -> origin VARCHAR(30) NOT NULL # where collected
);
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO INSECT (id,name,date,origin) VALUES
    -> (NULL,'housefly','2001-09-10','kitchen'),
    -> (NULL,'millipede','2001-09-10','driveway'),
    -> (NULL,'grasshopper','2001-09-10','front yard');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM INSECT ORDER BY id;
+----+-------------+------------+------------+
| id | name        | date       | origin     |
+----+-------------+------------+------------+
|  1 | housefly    | 2001-09-10 | kitchen    |
|  2 | millipede   | 2001-09-10 | driveway   |
|  3 | grasshopper | 2001-09-10 | front yard |
+----+-------------+------------+------------+
3 rows in set (0.00 sec)

获取 AUTO_INCREMENT 值

LAST_INSERT_ID() 是一个 SQL 函数,可以用在任何能够执行 SQL 语句地方。另外,Perl 和 PHP 各自提供了其独有的函数,用于获得最后一条记录的 AUTO_INCREMENT 值。

PHP 示例

在执行完会产生自增值的查询后,可以通过调用 mysql_insert_id() 来获取此值:

mysql_query ("INSERT INTO INSECT (name,date,origin)
VALUES('moth','2001-09-14','windowsill')", $conn_id);
$seq = mysql_insert_id ($conn_id);

重新编号现有序列

当你从表中删除了很多记录后,可能会想要对所有的记录重新定序。只要略施小计就能达到此目的,不过如果你的表与其他表之间存在连接的话,请千万小心。

当你觉得不得不对 AUTO_INCREMENT 列重新定序时,从表中删除该列,然后再将其添加回来,就可以达到目的了。下面的示例展示了如何使用这种方法,为 INSECT 表中的 ID 值重新定序:

mysql> ALTER TABLE INSECT DROP id;
mysql> ALTER TABLE insect
    -> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
    -> ADD PRIMARY KEY (id);

从特定值的序列

默认情况下,MySQL 中序列的起始值为 1,不过你可以在创建数据表的时候,指定任意其他值。下面的示例中,MySQL 将序列的起始值设为 100:

mysql> CREATE TABLE INSECT
    -> (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,
    -> PRIMARY KEY (id),
    -> name VARCHAR(30) NOT NULL, # type of insect
    -> date DATE NOT NULL, # date collected
    -> origin VARCHAR(30) NOT NULL # where collected
);

或者,你也可以先创建数据表,然后使用 ALTER TABLE 来设置序列的起始值:

mysql> ALTER TABLE t AUTO_INCREMENT = 100;

Oracle 自增序列

语法:

    CREATE SEQUENCE 序列名称
    [INCREMNET BY 步长]
    [START WITH 开始值]
    [MAXVALUE 最大值 | NOMAXVALUE]
    [MINVALUE 最小值 | NOMINVALUE]
    [CYCLE|NOCYCLE]
    [CACHE 缓存大小|NOCACHE]

(1)创建一个myseq的默认序列

create sequence myseq;

(2)查询数据字典

sequence.jpg

(3)通过nextval属性操作序列

> select myseq.nextval from dual;
NEXTVAL
---------------
 1

(4)通过nextval属性操作序列

> select myseq.currval from dual;
CURRVAL
---------------
 1

当用户每次重复调用myseq.nextval操作序列的时候,序列都会自动地增长,而且增长的步长 (INCREMENT_BY)设置为1,而当用户只调用myseq.currval操作序列时,无论调用多少次,都只会返回当前最后一次增长的序列值,不会进行增长。

序列的属性

SEQUENCE_NAME:序列名称。

MIN_VALUE:此序列开始的默认最小值(默认是0)

MAX_VALUE:此序列开始的默认最大值(默认是99....99<27个>)

INCREMENT_BY:序列每次增长的步长(默认是1)

CYCLE_FLAG:循环标记,Y表示循环;N表示非循环。

CACHE_SIZE:序列操作的缓存量(默认是20)。

LAST_NUMBER:最后一次操作的数值。

序列的使用

(5)创建member表

>CREATE TABLE member (
  mid NUMBER,name VARCHAR2(50) NOT NULL,
  CONSTRAINT pk_mid PRIMARY KEY(mid)
);
Table created.

(6)编写数据插入语句,向member表中增加记录

> insert into member values(myseq.nextval,'lala'||myseq.nextval);

(7)执行上一步操作,插入数据(重复六次)

> /
1 row created.

(8)检索全部member表数据

SCOTT@SDEDU> select * from member;
MID        NAME
---------- ----------------
    4          lala4
    5          lala5
    6          lala6
    7          lala7
    8          lala8
    9          lala9
   10         lala10
7 rows selected.

序列的使用进阶

(9)创建一个新的序列,让其每次的增长步长3

SCOTT@SDEDU> 
create sequence myseq1 increment by 3;
Sequence created.

(10)通过user_sequences数据字典查询序列是否已经成功创建

SCOTT@SDEDU> SELECT sequence_name,increment_by FROM user_sequences ;
SEQUENCE_NAME INCREMENT_BY
------------------------------  ----------------------------
MYSEQ     1
MYSEQ1    3
上一篇: SQL事务
下一篇: SQL通配符
推荐文章
  • mysql只支持一种join算法:Nested-LoopJoin(嵌套循环连接),但Nested-LoopJoin有三种变种:SimpleNested-LoopJoin,IndexNested-LoopJoin,BlockNested-LoopJoin(简单-索引-缓冲区)原理:1.SimpleNe
  • redis是一个内存数据库,一旦断电或服务器进程退出,内存数据库中的数据将全部丢失,所以需要redis持久化 redis持久化就是把数据保存在磁盘上,利用永久性存储介质将数据保存,在特定的时间将保存的数据进行恢复的工作机制redis提供两种持久化机制RDB:存储数据结果,关注点在数据AOF:存储操作
  • 通过SQL的执行过程来介绍MySQL的基础结构.     首先有一个user_info表,表里有一个id字段,执行下面这条查询语句:Select * form user_info where i
  • 索引(Index)是帮助MySQL高效获取数据的数据结构,索引的目的在于提高查询效率,就像字典和书籍的目录一样,有了目录,可以帮助你快速查找你需要的内容。可以理解为一个排好序的快速查找数据结构。也就是
  • 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什么要有四个隔离级别。今天我们就先来聊聊MySQL中事务的隔离性的实现原理,后续还会继续出文章分析其他特性的
  • 前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句
学习大纲