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。

首先,將一個新的資料列插入到 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 身分識別欄位。

這個教學對您有幫助嗎?