身分欄位是一個特殊的欄位,會從隱含的序列 (sequence) 自動產生。它可以被用來產生鍵值。
要建立身分欄位,請在 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
期間,如果欄位是語句中指定的資料表中的身分欄位,則該欄位將被視為身分欄位,並應用相應的身分屬性。
分割區會從已分割的資料表繼承身分欄位。它們不能擁有自己的身分欄位。給定身分欄位的屬性在分割區層次結構中的所有分割區中都是一致的。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單回報文件問題。