2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17
開發版本: devel

5.3. 標識列 #

標識列是一種特殊列,它由一個隱式序列自動生成。它可以用於生成鍵值。

要建立標識列,請在 CREATE TABLE 中使用 GENERATED ... AS IDENTITY 子句,例如

CREATE TABLE people (
    id bigint GENERATED ALWAYS AS IDENTITY,
    ...,
);

或者,替代地

CREATE TABLE people (
    id bigint GENERATED BY DEFAULT AS IDENTITY,
    ...,
);

有關更多詳細資訊,請參閱 CREATE TABLE

如果在具有標識列的表上執行 INSERT 命令,並且沒有為標識列顯式指定值,那麼將插入由隱式序列生成的值。例如,使用上述定義並假定有其他適當的列,寫入

INSERT INTO people (name, address) VALUES ('A', 'foo');
INSERT INTO people (name, address) VALUES ('B', 'bar');

將生成從 1 開始的 id 列的值,併產生以下表資料

 id | name | address
----+------+---------
  1 | A    | foo
  2 | B    | bar

或者,關鍵字 DEFAULT 可以替代值進行指定,以顯式請求序列生成的值,如下所示

INSERT INTO people (id, name, address) VALUES (DEFAULT, 'C', 'baz');

同樣,關鍵字 DEFAULT 可以在 UPDATE 命令中使用。

因此,在許多方面,標識列的行為類似於具有預設值的列。

列定義中的 ALWAYSBY DEFAULT 子句決定了在 INSERTUPDATE 命令中如何顯式處理使用者指定的值。在 INSERT 命令中,如果選擇 ALWAYS,則只有在 INSERT 語句指定了 OVERRIDING SYSTEM VALUE 時,才會接受使用者指定的值。如果選擇 BY DEFAULT,則使用者指定的值具有優先權。因此,使用 BY DEFAULT 會產生與預設值更相似的行為,其中預設值可以被顯式值覆蓋,而 ALWAYS 對意外插入顯式值提供了一些額外的保護。

標識列的資料型別必須是序列支援的資料型別之一。(請參閱 CREATE SEQUENCE。)在建立標識列時(請參閱 CREATE TABLE)可以指定關聯序列的屬性,或者之後進行更改(請參閱 ALTER TABLE)。

標識列會自動標記為 NOT NULL。但是,標識列不保證唯一性。(序列通常返回唯一值,但序列可能會被重置,或者值可能會被手動插入到標識列中,如上所述。)唯一性需要使用 PRIMARY KEYUNIQUE 約束來強制執行。

在表繼承層次結構中,子表中的標識列及其屬性獨立於其父表中的標識列。子表不會自動從父表繼承標識列或其屬性。在 INSERTUPDATE 期間,如果列是語句中命名的表中的標識列,並且應用了相應的標識屬性,則該列被視為標識列。

分割槽會繼承分割槽表的標識列。它們不能有自己的標識列。給定標識列的屬性在分割槽層次結構的所有分割槽中是一致的。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。