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)查询数据字典
(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
原文链接: https://www.yukx.com/moran/article/details/1018.html 优科学习网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中事务的隔离性的实现原理,后续还会继续出文章分析其他特性的
-
前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句