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 標識列來定義一個能自動生成唯一整數的列。

資料庫 #

測驗 #

本教程是否有幫助?
© .