創建一張新表。
語法
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參數)。
說明
|
table name | 新創建表的名稱。
說明 可以采用模式限定的方式引用。
|
column name | 新表中要創建列的名稱。 |
data type | 列的數據類型。數據類型可能包括數組定義。 |
DEFAULT default_expr | DEFAULT 子句為出現在列定義中的列分配一個默認值。這個值可以是任意表達式(但不允許使用子查詢和當前表中對其他列的引用)。默認表達式的數據類型必須匹配列的數據類型。
當在插入操作中沒有為列指定值的時候,您可以使用默認表達式。如果沒有為列指定默認值。那么默認值為空。 |
CONSTRAINT constraint_name | 為列或者表約束所指定的名稱(這個名稱可選)。如果沒有指定的話,那么系統會為這個約束自動產生一個名稱。 |
NOT NULL | 不允許列中包含空值。 |
PRIMARY KEY - 列級約束 |
主鍵約束指定表上的一列或者多列數據只包含唯一(不可重復),非空的值。主鍵僅僅是唯一性約束和非空約束的組合。但是將一個列的集合標識為主鍵提供了關于模式設計的元數據,因為主鍵會使其它表將這個列集合做為記錄的唯一性標識。 說明
|
PRIMARY KEY ( column_name [, ...] ) - 表級約束 | |
CHECK (expression) |
只有滿足這個布爾表達式,插入或者更新記錄的操作才能成功。如果表達式的計算結果為true或者unkown,那么表示滿足條件。任何無法滿足表達式的插入或者更新操作記錄都將產生一個錯誤異常,并且插入和更新操作不能改變數據庫的記錄值。指定為列級約束的檢查約束只能訪問相關列的值,同時出現在表級約束的表達式可以引用多列值。 說明
CHECK 表達式不能包含子查詢或者引用非當前記錄列的變量。
|
REFERENCES reftable [ ( refcolumn ) ] [ ON DELETE action ] - 列級約束 |
這些子句指定了一個外鍵約束,要求新創建表的相關列只能包含符合所引用表中的列的值。如果沒有使用 除此之外,當所引用列的數據發生改變時,在這個表上相關列上也要執行相關的操作。當刪除引用表的記錄的時候,
ON DELETE 子句會指定要執行的操作。盡管約束可以是延遲的,但是引用操作不能延遲。針對每個子句,允許的操作如下:
說明 如果被引用的列的值經常改變,在外鍵列上最好加上一個索引。這樣確保與外鍵列相關的引用操作能夠執行的更有效率。
|
FOREIGN KEY ( column [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ ON DELETE action ] - 表級約束 | |
NOT DEFERRABLE | 用于控制約束是否可以延遲。每一條命令執行后,非延遲的約束就會立即進行檢查。可延遲的約束檢查只有在事務結束后才進行(使用SET CONSTRAINTS 命令實現此操作)。
|
DEFERRABLE | |
INITIALLY IMMEDIATE | 如果約束是可延遲的,這個子句指定了進行約束檢查的缺省時間值。
如果約束是INITIALLY IMMEDIATE,那么在每條語句執行后,就會進行約束檢查。這是默認情況。 如果約束是INITIALLY DEFERRED,那么只有在事務結束后才能進行約束檢查。 您可以使用SET CONSTRAINT 命令來修改約束檢查時間。
|
INITIALLY DEFERRED | |
ON COMMIT | 在事務塊結束時處理臨時表的操作可以由ON COMMIT來控制。包含以下兩個選項:
|
描述
CREATE TABLE
命令在當前數據庫中創建一張新表,新創建的表初始狀態下沒有內容。執行CREATE TABLE
命令的用戶是新創建表的所有者。
如果指定了模式名稱(例如,CREATE TABLE myschema.mytable…
),那么就在指定的模式中創建表,否則就是在當前模式下創建表。而臨時表只在一個特定的模式下存在,所以在創建臨時表的時候不需要指定模式名稱。表名不能和同一模式下其他表,序列,索引或者視圖的名稱一樣。
CREATE TABLE
命令同時也會自動創建一個數據類型用來表示與表中一條記錄相對應的復合類型。因此,在同一模式中,表不能和已存在數據類型有相同的名稱。
一張表可以有最多1600個數據列(而在實際情況下,由于字段長度的限制,真正有效的限制值更低一些)。
- 列級約束:做為列定義的一部分而進行定義的。
- 表級約束:不和特定的列相聯系,包括多個列。
示例
創建表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;