定義一個新表。
語法
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_expr | DEFAULT 子句為其中顯示列定義的列分配默認數據值。值為任意無變量表達式(不允許對當前表中的其他列建立子查詢和交叉引用)。默認表達式的數據類型必須與列的數據類型相匹配。 說明 默認表達式將用在未指定列值的任何插入操作中。如果列沒有默認值,則默認值為 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 子句指定當被引用表中的被引用行被刪除時執行的操作。即使約束是可延遲的,也不能延遲引用操作。以下是每個子句可能的操作:
如果被引用列更改頻繁,那么明智的做法是添加外鍵列的索引,以便更有效地執行與外鍵列關聯的引用操作。 |
DEFERRABLE NOT DEFERRABLE | 這控制是否可以延遲約束。在每個命令之后立即檢查不可延遲的約束。檢查可延遲的約束可能會推遲到事務結束(使用 SET CONSTRAINTS 命令)。NOT DEFERRABLE 是默認值。目前只有外鍵約束才接受此子句。所有其他約束類型都不可延遲。 |
INITIALLY IMMEDIATE INITIALLY DEFERRED | 如果約束是可延遲的,則此子句指定檢查約束的默認時間。如果約束是 INITIALLY IMMEDIATE,則在每條語句后檢查它。這是默認值。如果約束是 INITIALLY DEFERRED,則僅在事務結束時檢查。約束檢查時間可以通過 SET CONSTRAINTS 命令更改。 |
ON COMMIT | 可以使用 ON COMMIT 控制事務塊結束時臨時表的行為。兩個選項是:
|
示例
創建表 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 定義唯一表約束??梢栽诒淼囊涣谢蚨嗔猩隙x唯一表約束。
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 定義主鍵表約束??梢栽诒淼囊涣谢蚨嗔猩隙x主鍵表約束。
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;