標識列是一種特殊列,它由一個隱式序列自動生成。它可以用於生成鍵值。
要建立標識列,請在 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 命令中使用。
因此,在許多方面,標識列的行為類似於具有預設值的列。
列定義中的 ALWAYS 和 BY DEFAULT 子句決定了在 INSERT 和 UPDATE 命令中如何顯式處理使用者指定的值。在 INSERT 命令中,如果選擇 ALWAYS,則只有在 INSERT 語句指定了 OVERRIDING SYSTEM VALUE 時,才會接受使用者指定的值。如果選擇 BY DEFAULT,則使用者指定的值具有優先權。因此,使用 BY DEFAULT 會產生與預設值更相似的行為,其中預設值可以被顯式值覆蓋,而 ALWAYS 對意外插入顯式值提供了一些額外的保護。
標識列的資料型別必須是序列支援的資料型別之一。(請參閱 CREATE SEQUENCE。)在建立標識列時(請參閱 CREATE TABLE)可以指定關聯序列的屬性,或者之後進行更改(請參閱 ALTER TABLE)。
標識列會自動標記為 NOT NULL。但是,標識列不保證唯一性。(序列通常返回唯一值,但序列可能會被重置,或者值可能會被手動插入到標識列中,如上所述。)唯一性需要使用 PRIMARY KEY 或 UNIQUE 約束來強制執行。
在表繼承層次結構中,子表中的標識列及其屬性獨立於其父表中的標識列。子表不會自動從父表繼承標識列或其屬性。在 INSERT 或 UPDATE 期間,如果列是語句中命名的表中的標識列,並且應用了相應的標識屬性,則該列被視為標識列。
分割槽會繼承分割槽表的標識列。它們不能有自己的標識列。給定標識列的屬性在分割槽層次結構的所有分割槽中是一致的。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。