摘要:在本教學中,您將學習如何使用 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)

第三,通過為 rank_id
和 rank_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)

請注意,與先前使用 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)

其次,將另一個資料列插入到 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)

在本教學中,您已學習如何使用 GENERATED AS IDENTITY
定義 SQL 身分識別欄位。