本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
CREATE TABLE
CREATE TABLE 可定義新的資料表。
支援的語法
CREATE TABLE [ IF NOT EXISTS ] table_name ( [ { column_name data_type [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option ... ] } [, ... ] ] ) where column_constraint is: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | GENERATED ALWAYS AS ( generation_expr ) STORED | GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY ( sequence_options ) | UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters | PRIMARY KEY index_parameters | REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] and table_constraint is: [ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH FULL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] and referential_action in a FOREIGN KEY/REFERENCES constraint is: { NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] } and like_option is: { INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | ALL } index_parameters in UNIQUE and PRIMARY KEY constraints are: [ INCLUDE ( column_name [, ... ] ) ]
身分資料欄
注意
使用身分資料欄時,應仔細考慮快取值。如需詳細資訊,請參閱 CREATE SEQUENCE 頁面上的重要標註。
如需如何根據工作負載模式最佳使用身分資料欄的指引,請參閱 使用序列和身分資料欄。
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY ( 子句會將資料欄建立為身分資料欄。它將有一個隱含序列連接到它,在新插入的資料列中,資料欄將自動具有來自指派給它的序列的值。這類資料欄隱含為 sequence_options )NOT NULL。
子句ALWAYS和 會BY DEFAULT決定在 INSERT和 UPDATE命令中明確處理使用者指定值的方式。
在 INSERT命令中,如果選取 ALWAYS ,則只有在INSERT陳述式指定 時,才會接受使用者指定的值OVERRIDING SYSTEM VALUE。如果選取 BY DEFAULT ,則使用者指定的值優先。
在 UPDATE命令中,如果選取 ALWAYS ,DEFAULT則會拒絕將資料欄更新為 以外的任何值。BY DEFAULT 如果選取 ,則欄可以正常更新。( UPDATE命令沒有 OVERRIDING子句。)
sequence_options 子句可用來覆寫序列的參數。可用的選項包括針對 顯示的選項CREATE SEQUENCE,加上 SEQUENCE NAME 。如果沒有 nameSEQUENCE NAME,系統會為序列選擇未使用的名稱。
儲存模式
選用的 STORAGE 子句會設定 欄的儲存模式。使用這些選項來控制可變長度資料類型的壓縮行為,例如 JSON、JSONB、TEXT、 VARCHAR和 BPCHAR。
Amazon Aurora DSQL 會在超過特定大小時壓縮某些資料類型。若要停用此行為,請使用 PLAIN或 EXTERNAL選項。
PLAIN-
Aurora DSQL 會在不壓縮的情況下內嵌存放資料。這是固定長度資料類型的唯一選項,例如
integer。使用此選項可停用某些可變長度類型的壓縮。 MAIN|EXTENDED|DEFAULT-
MAIN如果基礎資料類型支援壓縮, 和EXTENDED允許對資料欄進行選擇性壓縮。DEFAULT會將儲存模式設定為資料欄資料類型的預設模式。 EXTERNAL-
Aurora DSQL 目前不支援 TOAST 資料表,但會
EXTERNAL停用對支援壓縮之資料類型的壓縮。
外部金鑰限制條件
REFERENCES 和 FOREIGN KEY子句指定外部索引鍵限制條件,要求新資料表的一或多個資料欄群組只能包含符合所參考資料表某些資料列中參考資料欄中值的值 (這些值)。如果您省略 refcolumn 清單,Aurora DSQL 會使用 reftable 的主索引鍵。否則,參考欄清單必須參考不可延遲的唯一或主索引鍵限制條件的資料欄。
Aurora DSQL 會使用指定的比對類型,比對插入參考欄的值與參考資料表和參考欄的值 (這些值)。支援兩種比對類型: MATCH FULL和 MATCH SIMPLE(這是預設值)。
您可以將外部索引鍵定義為資料欄限制或資料表限制:
-
資料欄限制 (REFERENCES) – 在單欄外部索引鍵的資料欄資料類型
REFERENCES之後使用 。 -
資料表限制條件 (FOREIGN KEY) –
FOREIGN KEY (...) REFERENCES ...用於單欄或多欄外部索引鍵。
參考動作
當您變更參考欄中的資料時,Aurora DSQL 會對參考資料表資料欄中的資料執行動作。ON DELETE 子句指定交易刪除參考資料表中參考的資料列時要執行的動作。同樣地, ON UPDATE子句會指定交易將參考資料欄更新為新值時要執行的動作。如果交易更新資料列但未變更參考的資料欄,Aurora DSQL 不會採取任何動作。
Aurora DSQL 支援下列參考動作:
NO ACTION(default)-
如果刪除或更新會導致外部金鑰限制違規,則會產生錯誤。如果限制條件延遲,Aurora DSQL 會在限制條件檢查時間產生此錯誤,如果有任何參考資料列仍然存在。這是預設的動作。
RESTRICT-
如果要刪除或更新的資料列符合參考資料表中的資料列,則會產生錯誤。即使動作之後的狀態不會違反外部金鑰限制,這也會防止動作。尤其可防止參考資料列更新為不同但比較為相等的值。與 不同
NO ACTION,RESTRICT檢查無法延遲。
層疊動作會計入交易修改限制
更新或刪除參考的資料列時SET NULL, CASCADE、 和 SET DEFAULT動作會自動修改參考資料表中的資料列。Aurora DSQL 交易資料列限制適用於這些動作,如果未小心使用,可能會導致非預期的失敗。對於子列基數不受限制或無法預測的RESTRICT外部金鑰關係,偏好 NO ACTION或 。如需詳細資訊,請參閱Aurora DSQL 資料庫限制。
CASCADE-
刪除任何參考已刪除資料列的資料列,或分別將參考資料欄的值更新為參考資料欄的新值 (分別為)。
SET NULL [ ( column_name [, ... ] ) ]-
將所有參考資料欄或參考資料欄的指定子集設定為 null。只能為
ON DELETE動作指定欄的子集。 SET DEFAULT [ ( column_name [, ... ] ) ]-
將所有參考欄或參考欄的指定子集設定為其預設值。只能為
ON DELETE動作指定資料欄子集。(參考資料表中必須有符合預設值的資料列,如果它們不是 null,否則操作將會失敗。)
比對類型
Aurora DSQL 支援下列比對類型:
MATCH SIMPLE(default)-
允許任何外部索引鍵資料欄為 null。如果其中任何一個是 null,則列不需要在參考的資料表中具有相符項目。
MATCH FULL-
不允許多欄外部索引鍵的一個資料欄為 null,除非所有外部索引鍵資料欄都是 null。如果全部都是 null,則列不需要在參考的資料表中具有相符項目。
您可以對參考資料欄套用NOT NULL限制,以防止這些案例發生。
可延遲性
您可以指定外部金鑰限制條件的延遲性來控制檢查時間:
NOT DEFERRABLE(default)-
Aurora DSQL 會在每個陳述式之後立即檢查此限制。您無法將其變更為使用 延遲
SET CONSTRAINTS。 DEFERRABLE-
限制條件可以使用 延遲到交易的結尾
SET CONSTRAINTS。如果沒有INITIALLY子句,則預設為INITIALLY IMMEDIATE。 DEFERRABLE INITIALLY IMMEDIATE-
根據預設,Aurora DSQL 會在每個陳述式之後檢查此限制,但您可以使用 在交易中延遲。
SET CONSTRAINTS ... DEFERRED DEFERRABLE INITIALLY DEFERRED-
根據預設,Aurora DSQL 會在交易遞交時間檢查此限制。您可以使用 將其變更為交易中的立即
SET CONSTRAINTS ... IMMEDIATE。
如需在交易中變更限制條件檢查時間的詳細資訊,請參閱 SET CONSTRAINTS。
僅限外部金鑰限制條件
在 Aurora DSQL 中, DEFERRABLE選項僅適用於外部金鑰限制條件。
外部金鑰限制範例
假設您有一個存放產品的資料表:
CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric );
現在您想要儲存這些產品的訂單的資料表。您想要確保訂單資料表包含對實際存在之產品的參考。在參考產品資料表的訂單資料表中定義外部金鑰限制條件:
CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products (product_no), quantity integer );
現在,您無法使用產品資料表中未出現的非 NULL product_no項目建立訂單。
在這種情況下,訂單資料表是參考資料表,而產品資料表是參考資料表。同樣地,也有參考和參考的資料欄。
您可以將上述命令縮短為:
CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products, quantity integer );
如果您省略欄清單,Aurora DSQL 會使用參考資料表的主索引鍵 (參考欄)。
您可以照常為外部金鑰限制條件指派自己的名稱:
CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer CONSTRAINT fk_product REFERENCES products, quantity integer );
外部索引鍵也可以限制和參考一組資料欄。然後,它需要以資料表限制格式寫入:
CREATE TABLE inventory ( warehouse_id integer, product_no integer, quantity integer, PRIMARY KEY (warehouse_id, product_no) ); CREATE TABLE shipments ( shipment_id integer PRIMARY KEY, warehouse_id integer, product_no integer, FOREIGN KEY (warehouse_id, product_no) REFERENCES inventory (warehouse_id, product_no) );
限制資料欄的數量和類型必須與參考資料欄的數量和類型相容。
資料表可以有多個外部金鑰限制。這用於實作資料表之間的many-to-many關係:
CREATE TABLE order_items ( product_no integer REFERENCES products, order_id integer REFERENCES orders, quantity integer, PRIMARY KEY (product_no, order_id) );
外部金鑰限制條件可以參考其所屬的相同資料表。這稱為自我參考外部金鑰。例如,如果您希望資料表的資料列代表樹狀結構的節點,您可以寫入:
CREATE TABLE tree ( node_id integer PRIMARY KEY, parent_id integer REFERENCES tree, name text );
最上層節點會有 NULL parent_id,而非 NULL parent_id項目則受限於參考資料表的有效資料列。
您可以指定參考動作,以控制刪除或更新參考資料列時發生的情況。下列範例使用 ON DELETE RESTRICT 來防止刪除訂單仍參考的產品:
CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products ON DELETE RESTRICT, quantity integer );
使用 RESTRICT,嘗試刪除具有參考訂單的產品會立即產生錯誤。使用預設 時NO ACTION,如果宣告限制條件 ,則檢查可以延遲到交易結尾DEFERRABLE。
若要建立可延遲至交易結束的外部金鑰,請使用 DEFERRABLE選項。當您需要在相同交易的兩個資料表中插入資料列時,無論順序為何,這很有用:
CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products DEFERRABLE INITIALLY DEFERRED, quantity integer );
使用 時DEFERRABLE INITIALLY DEFERRED,在遞交時間之前不會檢查限制。您可以在產品列存在之前插入訂單列,只要產品列在交易遞交時存在即可。
若要MATCH FULL搭配複合外部索引鍵使用 ,這需要所有參考的資料欄一起為 Null 或所有非 Null 一起:
CREATE TABLE shipments ( shipment_id integer PRIMARY KEY, warehouse_id integer, product_no integer, FOREIGN KEY (warehouse_id, product_no) REFERENCES inventory (warehouse_id, product_no) MATCH FULL );