摘要:在本教程中,您將學習如何使用 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 標識列來定義一個能自動生成唯一整數的列。