SQL 使用序列

SQL 使用序列

SQL中的 序列 是一种数据库对象,用于生成一系列唯一的整数值。它们在数据库中经常被使用,因为许多应用程序要求表中的每一行都包含一个唯一的值,并且序列提供了一种轻松生成它们的方式。序列是许多SQL数据库管理系统的特性,如Oracle,PostgreSQLSQL Server和IBM DB2。

使用 CREATE SEQUENCE 语句在 SQL 中创建序列。该语句指定序列的名称,起始值,增量和序列的其他属性。

语法

以下是在 SQL 中创建序列的语法-

CREATE SEQUENCE Sequence_Name
START WITH Initial_Value
INCREMENT BY Increment_Value
MINVALUE Minimum_Value
MAXVALUE Maximum_Value
CYCLE|NOCYCLE;

在这里,

  • Sequence_Name - 这指定了序列的名称。

  • Initial_Value - 这指定了序列应该从哪个值开始。

  • Increment_Value - 这指定了序列将自身递增的值。可以为正值或负值。

  • Minimum_Value - 这指定了序列的最小值。

  • Maximum_Value - 这指定了序列的最大值。

  • Cycle - 当序列达到其最大值时,它会从头开始重复。

  • Nocycle - 如果序列超过了最大值,将抛出一个异常。

示例

首先,让我们尝试使用以下查询创建一个名为“STUDENTS”的表 –

SQL> CREATE TABLE STUDENTS (ID INT, NAME CHAR(20), AGE INT NOT NULL);

现在,让我们使用如下查询中的INSERT语句向表中插入一些记录 –

SQL> INSERT INTO STUDENTS(ID, NAME, AGE) VALUES(NULL, 'Dhruv', '20');
INSERT INTO STUDENTS(ID, NAME, AGE) VALUES(NULL, 'Arjun', '23');
INSERT INTO STUDENTS(ID, NAME, AGE) VALUES(NULL, 'Dev', '25');
INSERT INTO STUDENTS(ID, NAME, AGE) VALUES(NULL, 'Riya', '19');
INSERT INTO STUDENTS(ID, NAME, AGE) VALUES(NULL, 'Aarohi','24');
INSERT INTO STUDENTS(ID, NAME, AGE) VALUES(NULL, 'Lisa', '20');
INSERT INTO STUDENTS(ID, NAME, AGE) VALUES(NULL, 'Roy', '24');

让我们使用以下查询来验证表STUDENTS是否已创建:

SQL> SELECT * FROM STUDENTS;

表在SQL数据库中成功创建。

+------+-----------+------+
|  ID  |     NAME  |  AGE |
+------+-----------+------+
| NULL |    Dhruv  |   20 |
| NULL |    Arjun  |   23 |
| NULL |    Dev    |   25 |
| NULL |    Riya   |   19 |
| NULL |    Aarohi |   24 |
| NULL |    Lisa   |   20 |
| NULL |    Roy    |   24 |
+------+-----------+------+

现在,让我们尝试使用以下语句在SQL中创建一个序列−

SQL> CREATE SEQUENCE My_Sequence AS INT
   START WITH 1
   INCREMENT BY 1
   MINVALUE 1
   MAXVALUE 5
   CYCLE;

在上面的查询中,该序列被命名为“ My_Sequence ”,并且从值1开始,每次生成一个值时递增1。该序列的最大值为5,并且在达到最大值时循环回到起始值。

创建序列后,可以使用它来生成唯一的整数值。现在,让我们尝试使用以下查询更新“ ID ”列的STUDENTS表中的数据-

SQL> UPDATE STUDENTS SET ID = NEXT VALUE FOR My_Sequence;

输出

当您执行上述查询时,输出结果如下所示 −

Commands completed successfully.

验证

让我们使用以下查询来验证表中的ID列是否已更新序列:

SQL> SELECT * FROM STUDENTS;

+------+-----------+------+
|  ID  |     NAME  |  AGE |
+------+-----------+------+
|    1 |    Dhruv  |   20 |
|    2 |    Arjun  |   23 |
|    3 |    Dev    |   25 |
|    4 |    Riya   |   19 |
|    5 |    Aarohi |   24 |
|    1 |    Lisa   |   20 |
|    2 |    Roy    |   24 |
+------+-----------+------+

使用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脚本提供了独立的函数来检索最后一条记录的自增值。

PERL示例

使用 mysql_insertid 属性来获取由查询生成的AUTO_INCREMENT值。通过数据库句柄或语句句柄访问此属性,取决于您如何发出查询。以下示例通过数据库句柄引用它。

$dbh->do ("INSERT INTO INSECT (name,date,origin)
VALUES('moth','2001-09-14','windowsill')");
my $seq = $dbh->{mysql_insertid};

PHP示例

发出一个生成AUTO_INCREMENT值的查询后,通过调用 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 列,可以通过从表中删除该列,然后再添加该列来完成。

以下示例显示了如何使用此技术对昆虫表中的 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;

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程