PL/SQL標準建表規範
(一)
–建立表 workcenter
CREATE TABLE workcenter –指定表名稱
(
id int, –新增編號欄位
name varchar2(200) –新增名稱欄位
)
(二)
–預設情況下,CREATE TABLE 會將表建立在當前的方案下,如果想在其他方案中建立資料表,那麼可以使用“方案名.表名稱”這樣的語法。例如在HR方案中建立workcenter資料表,可以使用如下語法:
–建立表 workcenter
CREATE TABLE hr.workcenter –指定表名稱
(
id int, –新增編號欄位
name varchar2(200) –新增名稱欄位
)
(三)
–下面的程式碼使用CREATE TABLE 語句建立了一個發票表invoices,使用了列型別屬性來對列進行基本的約束。
CREATE TABLE invoice
(
invoice_id NUMBER NOT NULL UNIQUE, –自動編號,唯一,不為空
vendor_id NUMBER NOT NULL, –供應商 ID
invocice_number VARCHAR2(50) NOT NULL, –發票編號
invocice_date DATE DEFAULT SYSDATE, –發票日期
invocice_total NUMBER(9,2) NOT NULL, –發票總數
payment_total NUMBER(9,2) DEFAULT 0 –付款總數
)
上述程式碼通過對列屬性的使用,使得一些列的值不能為NULL;一些列具有DEFAULT指定的預設值;而一些列的值必須在整個表的相同的列中唯一。
總結
下面的語法是建立一個表的最基本的語法:
CREATE TABLE [schema_name.]table_name
(
column_name_1 data_type [column_attributes]
[,colunmn_name_2 data_type [column_attributes]]…
[,table_level_constraints]
)
建立表副本
–CREATE TABLE提供的AS SELECT語句,允許從一個現有的表中建立一個新的表,建立的表可以包含原表的所有架構、欄位屬性、約束和資料記錄;也可以僅架構完全相同,而不包含資料,語法如下
CREATE TABLE AS SELECT {* | column(s)} FROM [WHERE ];
–例如建立scott方案下的emp表的副本幷包含所有的資料,則可以使用如下的語句:
CREATE TABLE emp_copy AS SELECT * from scott.emp_copy
–可以使用下面的語法僅建立一個架構而不包含任何表資料:
CREATE TABLE emp_copy AS SELECT * from scott.emp where 1=2;
上述程式碼中,複製的新表將於原來的表列具有完全相同的定義,但是可以通過改變查詢SELECT語句,例如使用函式進行型別的轉換等來建立不完全相同的型別,如一下程式碼所示。
CREATE TABLE emp_copy_others AS SELECT empno,ename,TO_CHAR(hiredate,’yyyy-MM-dd’) AS hiredate FROM Scott.emp;
注:使用CREATE TABLE..AS SELECT方式有如下幾個限制需要注意。
不能夠複製約束條件與列的預設值,這需要手工重新建立。
不能夠為新表指定表空間,預設情況下采用的是當前使用者的預設表空間。
一些大物件資料型別(比如Blob型別)或者是Long資料型別的資料,如果包含這種型別的查詢是不能建立成功的。
建立主鍵約束
–PRIMARY KEY 關鍵字指定列的型別為主鍵。當為列指定了主鍵後,列被強制為NOT NULL,並且列中每行都被強制為一個唯一值,此外,會根據這個列自動建立一個索引。
CREATE TABLE invoice
(
invoice_id NUMBER PRIMARY KEY, –自動編號,唯一,不為空
vendor_id NUMBER NOT NULL, –供應商 ID
invocice_number VARCHAR2(50) NOT NULL, –發票編號
invocice_date DATE DEFAULT SYSDATE, –發票日期
invocice_total NUMBER(9,2) NOT NULL, –發票總數
payment_total NUMBER(9,2) DEFAULT 0 –付款總數
)
–程式碼使用PRIMARY KEY關鍵字對invoice_id列進行修飾,表示其為表的主鍵,這是最簡單的指定表的主鍵的方式,但不是最好的程式設計習慣。建議的方法是在列或表級別使用CONSTRAINT關鍵字,為約束指定一個約束名,
因而對於建立表的程式碼也可以使用如下的語法,如程式碼下使用了列級別的CONSTRAINT關鍵字來建立表。
CREATE TABLE invoice
(
invoice_id NUMBER CONSTRAINT invoice_pk PRIMARY KEY, –自動編號,唯一,不為空
vendor_id NUMBER CONSTRAINT vendor_id_nn NOT NULL, –供應商ID
invoice_number VARCHAR2(50) CONSTRAINT vendor_number_nn NOT NULL, –發票編號
invocice_date DATE DEFAULT SYSDATE, –發票日期
invocice_total NUMBER(9,2) CONSTRAINT invocice_total_nn NOT NULL, –發票總數
payment_total NUMBER(9,2) DEFAULT 0 –付款總數
)
在表級別使用CONSTRAINT關鍵字
CREATE TABLE invoice
(
invoice_id NUMBER, –自動編號,唯一,不為空
vendor_id NUMBER, –供應商ID
invocice_number VARCHAR2(50) NOT NULL, –發票編號
invocice_date DATE DEFAULT SYSDATE, –發票日期
invocice_total NUMBER(9,2) NOT NULL, –發票總數
payment_total NUMBER(9,2) DEFAULT 0 –付款總數
CONSTRAINT invoice_pk PRIMARY KEY (invoice_id),
CONSTRAINT vendor_id_un UNIQUE (vendor_id)
–上述程式碼相對於列型別來說最大的好處在於可以使用多列,比如通過在括號內輸入以逗號分隔的多個列名,可以同時指定多列主鍵,列入如果要使用invoide_id和vendor_id作為主鍵可以使用如下程式碼:
CONSTRAINT invoiceid_vendorid_pk PRIMARY KEY (invoice_id,vendor_id),
建立檢查約束
–表級別的檢查約束
CREATE TABLE invoice_check
(
invoice_id NUMBER,
invocice_total NUMBER(9,2) DEFAULT 0,
payment_total NUMBER(9,2) DEFAULT 0,
CONSTRAINT invoice_ck CHECK(invocice_total<=5000 AND payment_total<=10000)
);