SQL 标识

摘要:在本教程中,您将学习如何使用 GENERATED AS IDENTITY 为表创建 SQL 标识列。

SQL 标识列简介

SQL 标识列是一个在 向表中添加新行 时自动生成值的列。要定义标识列,请使用 GENERATED AS IDENTITY 属性,如下所示

column_name data_type GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY[ ( sequence_option ) ]
Code language: SQL (Structured Query Language) (sql)

在该语法中

  • data_type 可以是任何整数 数据类型
  • GENERATED ALWAYS 为标识列生成连续的整数。如果您尝试 插入(或 更新)一个值到 GENERATED ALWAYS AS IDENTITY 列中,数据库系统将引发错误。
  • GENERATED BY DEFAULT 为标识列生成连续的整数。ただし、挿入または更新用の値を入力した場合、データベース システムはこの値を自動生成された値の代わりに挿入に使用します。

SQL 标识列示例

A) GENERATED ALWAYS 示例

首先,创建一个名为 ranks 的表,它有 rank_id 列作为标识列

CREATE TABLE ranks (
    rank_id INT GENERATED ALWAYS AS IDENTITY,
    rank_name CHAR
);
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)
SQL Identity - GENERATED ALWAYS AS IDENTITY example

三是为 rank_idrank_name 列提供值,插入新行

INSERT INTO ranks (rank_id, rank_name)
VALUES
    (2, 'B');
Code language: SQL (Structured Query Language) (sql)

数据库系统发出以下错误

[Err] ERROR:  cannot insert into column "rank_id"
DETAIL:  Column "rank_id" is an identity column defined as GENERATED ALWAYS.
Code language: SQL (Structured Query Language) (sql)

如需修复错误,请使用 GENERATED BY DEFAULT AS IDENTITY

B) GENERATED BY DEFAULT AS IDENTITY 示例

首先,删除 ranks 表并重新创建。这次我们使用 GENERATED BY DEFAULT AS IDENTITY 属性

DROP TABLE ranks;

CREATE TABLE ranks (
    rank_id INT GENERATED BY DEFAULT AS IDENTITY,
    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)
SQL Identity - GENERATED BY DEFAULT AS IDENTITY example

请注意,与使用 GENERATED ALWAYS AS IDENTITY 的前一个示例不同,这个语句也成立。

C) 序列选项示例

对于标识列,您可以使用以下语法指定起始值和增量值

START WITH starting_value 
INCREMENT BY increment_value;
Code 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。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)
SQL Identity - sequence option example

其次,向 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)
SQL Identity - sequence option example 2

在本教程中,您学习了如何使用 GENERATED AS IDENTITY 定义 SQL 标识列。

本教程对您有帮助吗?