限制主要有以下3種功能:
- 為資料庫內的表格建立實在的關係,例如 DEPT 和 EMP 表格的父子關係。
- 避免一些您不想要的資料進入資料庫,例如您不想資料庫儲存一個沒有名字的僱員紀錄。
- 避免刪除一些有關連性的資料,例如 EMP 與 DEPT 是有關連的,那就要避免您刪除 DEPT 表格,否則 EMP 的 DEPTNO 欄就不能對應到 DEPT 了。
總括來說,限制能夠維繫您的資料庫,和避免錯誤的資料進入資料庫。
Oracle 有以下5種基本的限制:
- Not Null - 非空
- Unique - 唯一的
- Check - 檢查
- Primary Key - 主要鍵
- Foreigh Key - 外來鍵
Not Null
您可以指定某個欄不可儲存 NULL 值,當您嘗試把該欄設為 NULL 值時,Oracle 會顯示錯誤訊息。以下示範如何把 EMPLOYEE_ID 一欄定義 NOT NULL 限制,並嘗試把它設為 NULL,引致 ORA-01400 錯誤:
SQL> CREATE TABLE EMPLOYEES (
2 EMPLOYEE_ID NUMBER(5) NOT NULL
3 );
Table created.
SQL> INSERT INTO EMPLOYEES VALUES(NULL);
INSERT INTO EMPLOYEES VALUES(NULL)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."EMPLOYEES"."EMPLOYEE_ID")
Unique
如果您想某欄的所有資料都必須是唯一的,即是不可出現重覆的值,那就可以把該欄定義 UNIQUE 限制,例如僱員識別碼一欄,因為它一般會用來識別不同的僱員,所以把它定義 UNIQUE 限制,Oracle 就會防止它含有重覆的值。不過,UNIQUE 限制只會檢查那些不是 NULL 的值是否重覆,而不會檢查 NULL 值。
SQL> CREATE TABLE EMPLOYEES (
2 EMPLOYEE_ID NUMBER(5) UNIQUE
3 );
Table created.
SQL> INSERT INTO EMPLOYEES VALUES(1);
1 row created.
SQL> INSERT INTO EMPLOYEES VALUES(1);
INSERT INTO EMPLOYEES VALUES(1)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.SYS_C001265) violated
留意錯誤訊息出現的 SCOTT.SYS_C001265 ,其中的 SYS_C001265 是個限制名稱,其實您可以在定義一個限制時同時定義它的名稱,那麼當您違反了該限制時,Oracle 就會顯示該限制名稱,那就容易知道違反了什麼限制了。如果您沒有定義限制名稱,那麼 Oracle 會自動定義 SYS_Cxxxxxx 這樣子的名稱。
Check
Check 解作「檢查」,例如您可以檢查某個欄位的值是否符合某個條件,以下示範如何檢查 SALARY 一欄是否符合「少於 10000」這個條件:
SQL> CREATE TABLE EMPLOYEES (
2 SALARY NUMBER(6) CHECK (SALARY <= 10000)
3 );
Table created.
SQL> INSERT INTO EMPLOYEES VALUES(9000);
1 row created.
SQL> INSERT INTO EMPLOYEES VALUES(11000);
INSERT INTO EMPLOYEES VALUES(11000)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.SYS_C001267) violated
Check 限制只能檢查一些簡單的條件,例如把 SALARY 與 10000 這個固定的值比較,它不能與其它欄的值或變數比較。
Primary Key
Primary Key 限制的特性就是 Not Null 和 Unique 兩者的結合,即是說,定義為 Primary Key 的欄會同時受到 Not Null 和 Unique 的限制。以下示範 EMPLOYEE_ID 欄不能設為 NULL 值和不可含有重覆的值:
SQL> CREATE TABLE EMPLOYEES (
2 EMPLOYEE_ID NUMBER(5) PRIMARY KEY
3 );
Table created.
SQL> INSERT INTO EMPLOYEES VALUES(NULL);
INSERT INTO EMPLOYEES VALUES(NULL)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."EMPLOYEES"."EMPLOYEE_ID")
SQL> INSERT INTO EMPLOYEES VALUES(1);
1 row created.
SQL> INSERT INTO EMPLOYEES VALUES(1);
INSERT INTO EMPLOYEES VALUES(1)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.SYS_C001268) violated