SQL 标识列 (Identity)

摘要:在本教程中,您将学习如何使用 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_idrank_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 标识列来定义一个能自动生成唯一整数的列。

数据库 #

测验 #

本教程是否有帮助?
© .