標識列是一種特殊列,它由一個隱式序列自動生成。它可以用於生成鍵值。
要建立標識列,請在 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
期間,如果列是語句中命名的表中的標識列,並且應用了相應的標識屬性,則該列被視為標識列。
分割槽會繼承分割槽表的標識列。它們不能有自己的標識列。給定標識列的屬性在分割槽層次結構的所有分割槽中是一致的。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。