摘要:在本教程中,您将学习如何使用 GENERATED AS IDENTITY 为表创建 SQL 标识列。
SQL 标识列简介 #
SQL 标识列是一种在您向表中插入新行时,会自动为每一行生成唯一整数的列。
要定义标识列,您需要使用 IDENTITY 属性,其语法如下:
column_name datatype GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [sequence_option]Code language: SQL (Structured Query Language) (sql)在此语法中:
column_name:标识列的名称。datatype:标识列的数据类型,可以是任何整数数据类型。GENERATED ALWAYS会为标识列生成连续的整数,并阻止向该列插入值。如果您尝试向GENERATED ALWAYS列插入值,数据库系统将引发错误。GENERATED BY DEFAULT的工作方式与GENERATED ALWAYS类似,但允许您向该列插入值以覆盖生成的值。sequence_option:控制标识列如何生成值。
以下是 sequence_option 的选项:
START WITH:定义序列的起始编号。INCREMENT BY:设置序列的增量值。MINVALUE:指定序列的最小值。MAXVALUE:指定序列的最大值。CACHE:定义数据库系统为了性能而缓存的序列号数量。NOCACHE:关闭序列号的缓存。CYCLE:当序列号达到最大值时重新开始。NOCYCLE:防止序列重新开始。
在实践中,您通常会将标识列用作表的主键列,其中每个整数唯一地标识表中的每一行。
SQL 标识列示例 #
让我们来探讨一些使用 SQL 标识列的示例。
GENERATED ALWAYS AS IDENTITY 示例 #
首先,创建一个名为 ranks 的表,该表具有 rank_id 作为标识列:
CREATE TABLE ranks (
rank_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
rank_name CHAR NOT NULL
);Code language: SQL (Structured Query Language) (sql)其次,向 ranks 表中插入一个新行:
INSERT INTO
ranks (rank_name)
VALUES
('A');Code language: SQL (Structured Query Language) (sql)由于 rank_id 列具有 GENERATED AS IDENTITY 属性,数据库系统会为其生成一个顺序整数,如下查询结果所示:
SELECT
*
FROM
ranks;Code language: SQL (Structured Query Language) (sql) rank_id | rank_name
---------+-----------
1 | ACode language: SQL (Structured Query Language) (sql)第三,通过为 rank_id 和 rank_name 列提供值来插入一个新行:
INSERT INTO
ranks (rank_id, rank_name)
VALUES
(2, 'B');Code language: SQL (Structured Query Language) (sql)数据库系统抛出以下错误:
ERROR: cannot insert a non-DEFAULT value into column "rank_id"Code language: SQL (Structured Query Language) (sql)要修复此错误,您可以使用 GENERATED BY DEFAULT AS IDENTITY。
GENERATED BY DEFAULT AS IDENTITY 示例 #
首先,删除 ranks 表:
DROP TABLE ranks;Code language: SQL (Structured Query Language) (sql)其次,使用 GENERATED BY DEFAULT AS IDENTITY 属性重新创建 ranks 表:
CREATE TABLE ranks (
rank_id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
rank_name CHAR NOT NULL
);Code language: SQL (Structured Query Language) (sql)第三,向 ranks 表中插入一行:
INSERT INTO
ranks (rank_name)
VALUES
('A');Code language: SQL (Structured Query Language) (sql)第四,为 rank_id 列提供一个值,插入另一行:
INSERT INTO
ranks (rank_id, rank_name)
VALUES
(2, 'B');Code language: SQL (Structured Query Language) (sql)请注意,与上一个使用 GENERATED ALWAYS AS IDENTITY 的示例不同,这条 INSERT 语句也能正常工作。
最后,从 ranks 表中检索数据:
SELECT
rank_id,
rank_name
FROM
ranks;Code language: SQL (Structured Query Language) (sql)输出
rank_id | rank_name
---------+-----------
1 | A
2 | BCode language: SQL (Structured Query Language) (sql)序列选项示例 #
请看以下示例:
DROP TABLE ranks;
CREATE TABLE ranks (
rank_id INT GENERATED BY DEFAULT AS IDENTITY
(START WITH 10 INCREMENT BY 10),
rank_name CHAR NOT NULL
); Code language: SQL (Structured Query Language) (sql)在此示例中,rank_id 列的自动生成值从 10 开始,增量值也是 10。
首先,向 ranks 表中插入一个新行:
INSERT INTO
ranks (rank_name)
VALUES
('A');Code language: SQL (Structured Query Language) (sql)rank_id 列的起始值为 10,如下所示:
SELECT
*
FROM
ranks;Code language: SQL (Structured Query Language) (sql) rank_id | rank_name
---------+-----------
10 | A其次,向 ranks 表中插入另一行:
INSERT INTO
ranks (rank_name)
VALUES
('B');Code language: SQL (Structured Query Language) (sql)由于设置了增量值选项,第二行的 rank_id 值为 20。
SELECT
*
FROM
ranks;Code language: SQL (Structured Query Language) (sql) rank_id | rank_name
---------+-----------
10 | A
20 | B摘要 #
- 使用 SQL 标识列来定义一个能自动生成唯一整数的列。