創建一張新表。

語法

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 ]        

參數

參數名稱 描述
GLOBAL TEMPORARY 如果指定此參數,則會創建一張臨時表。在會話結束時會自動刪除臨時表,您也可以在當前事務結束時進行此操作(詳細信息請參考ON COMMIT參數)。
說明
  • 如果存在相同名稱的永久表,則當臨時表存在的時候,永久表對于當前會話來說是不可見的,除非使用模式限定的名稱來引用這些表。
  • 除此之外,臨時表在創建它的會話范圍之外也是不可見的(全局臨時表在這個方面與Oracle不兼容)。
  • 任何在臨時表上創建的索引也是臨時存在的。
table name 新創建表的名稱。
說明 可以采用模式限定的方式引用。
column name 新表中要創建列的名稱。
data type 列的數據類型。數據類型可能包括數組定義。
DEFAULT default_expr DEFAULT子句為出現在列定義中的列分配一個默認值。這個值可以是任意表達式(但不允許使用子查詢和當前表中對其他列的引用)。默認表達式的數據類型必須匹配列的數據類型。

當在插入操作中沒有為列指定值的時候,您可以使用默認表達式。如果沒有為列指定默認值。那么默認值為空。

CONSTRAINT constraint_name 為列或者表約束所指定的名稱(這個名稱可選)。如果沒有指定的話,那么系統會為這個約束自動產生一個名稱。
NOT NULL 不允許列中包含空值。
PRIMARY KEY - 列級約束

主鍵約束指定表上的一列或者多列數據只包含唯一(不可重復),非空的值。主鍵僅僅是唯一性約束和非空約束的組合。但是將一個列的集合標識為主鍵提供了關于模式設計的元數據,因為主鍵會使其它表將這個列集合做為記錄的唯一性標識。

說明
  • 無論是做為列級約束,還是表級約束,每個表只能指定一個主鍵。
  • 主鍵約束命名的列集合應該與同一表上為其他唯一性約束命名的列集合不同。
PRIMARY KEY ( column_name [, ...] ) - 表級約束
CHECK (expression)

CHECK子句指定了一個產生布爾結果值的表達式。

只有滿足這個布爾表達式,插入或者更新記錄的操作才能成功。如果表達式的計算結果為true或者unkown,那么表示滿足條件。任何無法滿足表達式的插入或者更新操作記錄都將產生一個錯誤異常,并且插入和更新操作不能改變數據庫的記錄值。指定為列級約束的檢查約束只能訪問相關列的值,同時出現在表級約束的表達式可以引用多列值。

說明 CHECK表達式不能包含子查詢或者引用非當前記錄列的變量。
REFERENCES reftable [ ( refcolumn ) ] [ ON DELETE action ] - 列級約束

這些子句指定了一個外鍵約束,要求新創建表的相關列只能包含符合所引用表中的列的值。如果沒有使用refcolumn,那么使用reftable的主鍵。被引用的列必須是被引用表中具有唯一性或者主鍵約束的列。

除此之外,當所引用列的數據發生改變時,在這個表上相關列上也要執行相關的操作。當刪除引用表的記錄的時候,ON DELETE子句會指定要執行的操作。盡管約束可以是延遲的,但是引用操作不能延遲。針對每個子句,允許的操作如下:
  • CASCADE:分別刪除任何引用被刪除記錄的記錄,或者將引用列上的值更新為被引用列的值。
  • SET NULL:將引用列的值設定為空。
說明 如果被引用的列的值經常改變,在外鍵列上最好加上一個索引。這樣確保與外鍵列相關的引用操作能夠執行的更有效率。
FOREIGN KEY ( column [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ ON DELETE action ] - 表級約束
NOT DEFERRABLE 用于控制約束是否可以延遲。每一條命令執行后,非延遲的約束就會立即進行檢查。可延遲的約束檢查只有在事務結束后才進行(使用SET CONSTRAINTS命令實現此操作)。

NOT DEFERRABLE是默認選項。當前只有外鍵約束使用這個子句。其他所有的約束類型是不可延遲的。

DEFERRABLE
INITIALLY IMMEDIATE 如果約束是可延遲的,這個子句指定了進行約束檢查的缺省時間值。

如果約束是INITIALLY IMMEDIATE,那么在每條語句執行后,就會進行約束檢查。這是默認情況。

如果約束是INITIALLY DEFERRED,那么只有在事務結束后才能進行約束檢查。

您可以使用SET CONSTRAINT命令來修改約束檢查時間。
INITIALLY DEFERRED
ON COMMIT 在事務塊結束時處理臨時表的操作可以由ON COMMIT來控制。包含以下兩個選項:
  • PRESERVE ROWS:在事務結束時不進行特定的操作。這是默認系統行為。
    說明 與Oracle不兼容,Oracle在默認狀態下是DELETE ROWS。
  • DELETE ROWS:在每一個事務結束的時候,刪除臨時表中的所有記錄。實質上,就是在每一次提交后,自動執行一個TRUNCATE操作。

描述

CREATE TABLE命令在當前數據庫中創建一張新表,新創建的表初始狀態下沒有內容。執行CREATE TABLE命令的用戶是新創建表的所有者。

如果指定了模式名稱(例如,CREATE TABLE myschema.mytable…),那么就在指定的模式中創建表,否則就是在當前模式下創建表。而臨時表只在一個特定的模式下存在,所以在創建臨時表的時候不需要指定模式名稱。表名不能和同一模式下其他表,序列,索引或者視圖的名稱一樣。

CREATE TABLE命令同時也會自動創建一個數據類型用來表示與表中一條記錄相對應的復合類型。因此,在同一模式中,表不能和已存在數據類型有相同的名稱。

一張表可以有最多1600個數據列(而在實際情況下,由于字段長度的限制,真正有效的限制值更低一些)。

可選的約束子句指定約束(或者是測試)條件。 只有滿足這些約束(或者測試)條件,才能執行插入或更新記錄的操作。約束實際是一個SQL對象,以各種方式幫助定義在表中有效值的集合。包含以下兩種方式定義約束:
  • 列級約束:做為列定義的一部分而進行定義的。
  • 表級約束:不和特定的列相聯系,包括多個列。
可以把每個列級約束寫成一個表級約束:如果約束只影響一列,那么一個列級約束只是一種簡單的表示方法。
說明 為實現強制唯一性,PolarDB自動為每一個唯一性約束或者主鍵約束創建一個索引。因此對于標識為主鍵的列,不用顯式地創建一個索引。

示例

創建表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)
);            

定義一個列級檢查約束:

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)
);            

定義一個表級檢查約束:

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;