AUTO_INCREMENT 和 IDENTITY 序列
AUTO_INCREMENT 和 IDENTITY 约束是将列与序列相关联的同义词。当添加新行时,此序列会自动递增列值。
在表中定义 AUTO_INCREMENT 或 IDENTITY 列,如下所示:
CREATE TABLE table-name...
(column-name
{AUTO_INCREMENT | IDENTITY}
( [ cache-size | start, increment [, cache-size ] ] )
AUTO_INCREMENT/IDENTITY 序列由定义它们的表拥有,并且不存在于该表之外。与命名序列不同,您不能使用 ALTER SEQUENCE 管理 AUTO_INCREMENT/IDENTITY 序列。例如,您不能独立于其表更改 AUTO_INCREMENT/IDENTITY 序列的架构。如果将表移动到另一个架构,序列会自动随之移动。
可以通过调用 LAST_INSERT_ID 函数获取为 AUTO_INCREMENT/IDENTITY 序列生成的最后一个值。
参数
限制
以下限制适用于 AUTO_INCREMENT/IDENTITY 列:
-
一个表只能包含一个 AUTO_INCREMENT/IDENTITY 列。
-
即使未提交尝试向表中插入值的事务,AUTO_INCREMENT/IDENTITY 值也绝对不会回退。
-
不能更改 AUTO_INCREMENT/IDENTITY 列的值。
具有 AUTO_INCREMENT/IDENTITY 列的表还可以包含一个或多个设置为命名序列的列。
示例
以下示例显示了如何使用 IDENTITY 列约束创建一个包含 ID 列的表。ID 列的初始值为 1。每次插入一行时,该列都将以 1 为增量递增。
-
创建名为
Premium_Customer
的表:=> CREATE TABLE Premium_Customer( ID IDENTITY(1,1), lname VARCHAR(25), fname VARCHAR(25), store_membership_card INTEGER ); => INSERT INTO Premium_Customer (lname, fname, store_membership_card ) VALUES ('Gupta', 'Saleem', 475987);
IDENTITY 列的种子值为 1,它指定加载到表中的第一行的值,增量为 1,它指定添加到上一行的 IDENTITY 值的值。
-
确认添加的行并查看 ID 值:
=> SELECT * FROM Premium_Customer; ID | lname | fname | store_membership_card ----+-------+--------+----------------------- 1 | Gupta | Saleem | 475987 (1 row)
-
增加一个行:
=> INSERT INTO Premium_Customer (lname, fname, store_membership_card) VALUES ('Lee', 'Chen', 598742);
-
调用 Vertica 函数 LAST_INSERT_ID。该函数将返回值 2,因为您之前插入了一个新客户 (Chen Lee),并且每次插入一行时,此值都会递增:
=> SELECT LAST_INSERT_ID(); last_insert_id ---------------- 2 (1 row)
-
查看
Premium_Customer
表中的所有 ID 值:=> SELECT * FROM Premium_Customer; ID | lname | fname | store_membership_card ----+-------+--------+----------------------- 1 | Gupta | Saleem | 475987 2 | Lee | Chen | 598742 (2 rows)
接下来的三个示例说明使用 IDENTITY 实参的三种有效方法。这些示例对 AUTO_INCREMENT 实参也有效。
第一个示例使用缓存 100,以及起始值 (1) 和增量值 (1) 的默认值:
=> CREATE TABLE t1(x IDENTITY(100), y INT);
第二个示例将起始值和增量值指定为 1,并将默认缓存值指定为 250,000:
=> CREATE TABLE t2(y IDENTITY(1,1), x INT);
第三个示例将起始值和增量值指定为 1,并将缓存值指定为 100:
=> CREATE TABLE t3(z IDENTITY(1,1,100), zx INT);