全部產品
Search
文件中心

PolarDB:CREATE TABLE

更新時間:Jul 06, 2024

定義一個新表。

文法

CREATE [ GLOBAL TEMPORARY ] TABLE table_name (
  { column_name data_type [ DEFAULT default_expr ]
  [ column_constraint [ ... ] ] | table_constraint } [, ...]
  )
  [ ON COMMIT { PRESERVE ROWS | DELETE ROWS } ]
  [ TABLESPACE tablespace ]

其中 column_constraint 是:

  [ CONSTRAINT constraint_name ]
  { NOT NULL |
    NULL |
    UNIQUE [ USING INDEX TABLESPACE tablespace ] |
    PRIMARY KEY [ USING INDEX TABLESPACE tablespace ] |
    CHECK (expression) |
    REFERENCES reftable [ ( refcolumn ) ]
      [ ON DELETE action ] }
  [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED |
    INITIALLY IMMEDIATE ]

table_constraint 是:

  [ CONSTRAINT constraint_name ]
  { UNIQUE ( column_name [, ...] )
      [ USING INDEX TABLESPACE tablespace ] |
    PRIMARY KEY ( column_name [, ...] )
      [ USING INDEX TABLESPACE tablespace ] |
    CHECK ( expression ) |
    FOREIGN KEY ( column_name [, ...] )
        REFERENCES reftable [ ( refcolumn [, ...] ) ]
      [ ON DELETE action ] }
  [ DEFERRABLE | NOT DEFERRABLE ]
  [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

說明

CREATE TABLE 將在當前資料庫中建立一個最初為空白的新表。表將由發布命令的使用者擁有。

如果給定 schema 名稱(如 CREATE TABLE myschema.mytable ...),則在指定的 schema 中建立表。否則在當前 schema 中建立。暫存資料表存在於特殊 schema 中,因此在建立暫存資料表時可以不給定 schema 名稱。表名稱必須與同一 schema 中其他任何錶、序列、索引或視圖的名稱有所區別。

CREATE TABLE 還會自動建立資料類型,以表示與表的一行對應的複合類型。因此,表不能與同一 schema 中的任何現有資料類型同名。

表不能超過 1600 列。(實際上,由於元組長度約束,有效限制會更低)。

可選約束子句指定為使插入或更新操作成功,新行或更新的行必須滿足的約束(或測試)。約束是一個 SQL 對象,可通過多種方式協助定義表中的有效值集。

定義約束的方式有兩種:資料表條件約束和列約束。列約束定義為列定義的一部分。資料表條件約束定義不依賴於特定列,可以包含多個列。每個列約束也可以寫為資料表條件約束。如果約束隻影響一列,則列約束只是符號上便利。

參數

參數說明
GLOBAL TEMPORARY建立暫存資料表。暫存資料表和普通表的區別在於資料的管理上,暫存資料表儲存事務或會話的中間結果集,並且暫存資料表中儲存的資料只對當前會話可見,所有會話都看不到其他會話的資料,即使其他會話完成提交,也看不到資料。暫存資料表不存在並發行為,對於當前會話都是獨立的。暫存資料表分事務級暫存資料表和會話級暫存資料表,請參見ON COMMIT參數。
table_name要建立的表的名稱(可能是 schema 限定的)。
column_name要在新表中建立的列的名稱。
data_type列的資料類型。這可能包括數組說明符。
DEFAULT default_exprDEFAULT 子句為其中顯示列定義的列分配預設資料值。值為任意無Variant 運算式(不允許對當前表中的其他列建立子查詢和交叉引用)。預設運算式的資料類型必須與列的資料類型相匹配。
說明 預設運算式將用在未指定列值的任何插入操作中。如果列沒有預設值,則預設值為 Null。
TABLESPACE資料表空間,不支援自訂。
CONSTRAINT constraint_name列約束或資料表條件約束的可選名稱。如果未指定,則系統產生一個名稱。
NOT NULL不允許列包含 Null 值。
NULL允許列包含 Null 值。這是預設值。

此子句僅可用於相容非標準 SQL 資料庫。我們不鼓勵將它用在新應用程式中。

UNIQUE - 列約束

UNIQUE (column_name [, ...] ) - 資料表條件約束

UNIQUE 約束指定由表的一列或多個不同列構成的組只能包含唯一值。唯一資料表條件約束的行為與列約束相同,只是增加了跨多列的功能。

出於唯一約束的目的,Null 值不被視為是相等的。

每個唯一資料表條件約束必須命名一組列,這些列與為該表定義的其他任何唯一約束或主鍵約束所命名的一組列不同。(否則它只是列出兩次的同一約束。)

PRIMARY KEY - 列約束

PRIMARY KEY ( column_name [, ...] ) - 資料表條件約束

主鍵約束指定表的一列或多列只能包含唯一(非重複)的非 Null 值。從技術方面而言,PRIMARY KEY 只是 UNIQUE 和 NOT NULL 的組合,不過將一組列標識為主鍵時還會提供有關 schema 設計的中繼資料,因為主鍵意味著其他表可以依賴於這一組列作為行的唯一識別碼。

無論作為列約束還是資料表條件約束,只能為表指定一個主鍵。

主鍵約束應當命名一組列,這些列與為同一表定義的任何唯一約束所命名的其他若干組列不同。

CHECK (expression)CHECK 子句指定一個運算式,該運算式產生為使插入或更新操作成功,新行或更新的行必須滿足的 Boolean 結果。運算式評估為 TRUE 或“未知”時表示成功。如果插入或更新操作的任何行產生 FALSE 結果,則會引發錯誤異常,並且插入或更新不會變更資料庫。指定為列約束的 CHECK 條件約束應當僅引用該列的值,而顯示在資料表條件約束中的運算式可以引用多列。

目前,CHECK 運算式不能包含子查詢,也不能引用除當前行的列以外的變數。

REFERENCES reftable [ ( refcolumn ) ] [ ON DELETE action ] - 列約束

FOREIGN KEY ( column [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ ON DELETE action ] - 資料表條件約束

這些子句指定外鍵約束,要求由新表的一列或多列構成的組只能包含與被參考資料表某行的被引用列中的值相匹配的值。如果省略 refcolumn,則使用 reftable 的主鍵。被引用列必須是被參考資料表中唯一約束或主鍵約束的列。
此外,當被引用列中的資料發生更改時,會對該表的列中的資料執行某些操作。ON DELETE 子句指定當被參考資料表中的被引用行被刪除時執行的操作。即使約束是可延遲的,也不能延遲引用操作。以下是每個子句可能的操作:
  • CASCADE:分別刪除引用已刪除行的任何行,或將引用列的值更新為被引用列的新值。
  • SET NULL:將引用列設定為 NULL。

如果被引用列更改頻繁,那麼明智的做法是添加外鍵列的索引,以便更有效地執行與外鍵列關聯的引用操作。

DEFERRABLE

NOT DEFERRABLE

這控制是否可以延遲約束。在每個命令之後立即檢查不可延遲的約束。檢查可延遲的約束可能會延遲到事務結束(使用 SET CONSTRAINTS 命令)。NOT DEFERRABLE 是預設值。目前只有外鍵約束才接受此子句。所有其他約束類型都不可延遲。
INITIALLY IMMEDIATE

INITIALLY DEFERRED

如果約束是可延遲的,則此子句指定檢查約束的預設時間。如果約束是 INITIALLY IMMEDIATE,則在每條語句後檢查它。這是預設值。如果約束是 INITIALLY DEFERRED,則僅在事務結束時檢查。約束檢查時間可以通過 SET CONSTRAINTS 命令更改。
ON COMMIT可以使用 ON COMMIT 控制事務塊結束時暫存資料表的行為。兩個選項是:
  • PRESERVE ROWS:會話級暫存資料表,當中斷連線或手動執行DELETE或TRUNCATE之前,暫存資料表中的資料一直存在,並且只有當前會話可以看到,其他會話看不到。(請注意,此方面與 Oracle 資料庫不相容。Oracle 預設值為 DELETE ROWS。)
  • DELETE ROWS:事務級暫存資料表,當COMMIT或ROLLBACK之前,這些資料一直存在,當事務提交之後,表中資料自動清除。本質上,每次提交時都會自動執行 TRUNCATE。
說明 PolarDB PostgreSQL版(相容Oracle)自動為每個唯一約束和主鍵約束建立索引,以強制實施唯一性。因此,沒有必要為主鍵列建立顯式索引。(有關更多資訊,請參閱 CREATE INDEX。)

樣本

建立表 dept 和表 emp:

CREATE TABLE dept (
    deptno          NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
    dname           VARCHAR2(14),
    loc             VARCHAR2(13)
);
CREATE TABLE emp (
    empno           NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
    ename           VARCHAR2(10),
    job             VARCHAR2(9),
    mgr             NUMBER(4),
    hiredate        DATE,
    sal             NUMBER(7,2),
    comm            NUMBER(7,2),
    deptno          NUMBER(2) CONSTRAINT emp_ref_dept_fk
                        REFERENCES dept(deptno)
);

為表 dept 定義唯一資料表條件約束。可以在表的一列或多列上定義唯一資料表條件約束。

CREATE TABLE dept (
    deptno          NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
    dname           VARCHAR2(14) CONSTRAINT dept_dname_uq UNIQUE,
    loc             VARCHAR2(13)
);

定義 CHECK 列約束:

CREATE TABLE emp (
    empno           NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
    ename           VARCHAR2(10),
    job             VARCHAR2(9),
    mgr             NUMBER(4),
    hiredate        DATE,
    sal             NUMBER(7,2) CONSTRAINT emp_sal_ck CHECK (sal > 0),
    comm            NUMBER(7,2),
    deptno          NUMBER(2) CONSTRAINT emp_ref_dept_fk
                        REFERENCES dept(deptno)
);

定義 CHECK 資料表條件約束:

CREATE TABLE emp (
    empno           NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
    ename           VARCHAR2(10),
    job             VARCHAR2(9),
    mgr             NUMBER(4),
    hiredate        DATE,
    sal             NUMBER(7,2),
    comm            NUMBER(7,2),
    deptno          NUMBER(2) CONSTRAINT emp_ref_dept_fk
                        REFERENCES dept(deptno),
    CONSTRAINT new_emp_ck CHECK (ename IS NOT NULL AND empno > 7000)
);

為表 jobhist 定義主鍵資料表條件約束。可以在表的一列或多列上定義主鍵資料表條件約束。

CREATE TABLE jobhist (
    empno           NUMBER(4) NOT NULL,
    startdate       DATE NOT NULL,
    enddate         DATE,
    job             VARCHAR2(9),
    sal             NUMBER(7,2),
    comm            NUMBER(7,2),
    deptno          NUMBER(2),
    chgdesc         VARCHAR2(80),
    CONSTRAINT jobhist_pk PRIMARY KEY (empno, startdate)
);

這將為列 job 分配一個文字常數預設值,並將 hiredate 的預設值作為插入行的日期。

CREATE TABLE emp (
    empno           NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
    ename           VARCHAR2(10),
    job             VARCHAR2(9) DEFAULT 'SALESMAN',
    mgr             NUMBER(4),
    hiredate        DATE DEFAULT SYSDATE,
    sal             NUMBER(7,2),
    comm            NUMBER(7,2),
    deptno          NUMBER(2) CONSTRAINT emp_ref_dept_fk
                        REFERENCES dept(deptno)
);

在資料表空間 diskvol1 中建立表 dept:

CREATE TABLE dept (
    deptno          NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
    dname           VARCHAR2(14),
    loc             VARCHAR2(13)
) TABLESPACE diskvol1;