在 Oracle 資料庫中,NOT NULL 約束用於確保欄位不接受空值,是資料完整性的重要保障。本文詳細說明建立資料表時與事後修改資料表兩種情境下的新增語法,並搭配實際操作範例幫助快速掌握。
在 CREATE TABLE 陳述式中,於欄位定義後加上 NOT NULL 即可。完整語法如下:
column_name data_type
[CONSTRAINT constraint_name] NOT NULL
CONSTRAINT constraint_name 為選擇性,用於自訂約束名稱,方便後續管理與除錯。
若資料表已存在,需使用 ALTER TABLE ... MODIFY 語法:
ALTER TABLE table_name MODIFY column_name [CONSTRAINT constraint_name] NOT NULL;
注意:欄位中若已存在 NULL 值,執行時將報錯 ORA-01400,需先更新資料或設定預設值。
同樣使用 ALTER TABLE ... MODIFY,將約束改為 NULL 即可:
ALTER TABLE table_name MODIFY column_name NULL;
以下透過 SQL*Plus 實際操作流程展示完整生命週期:
SQL> CREATE TABLE person(
2 pid NUMBER(4) NOT NULL,
3 pname VARCHAR2(20),
4 psex CHAR(2)
5 );
表已建立。
SQL> DESC person;
名稱 是否為空? 類型
----------------------------------------- -------- -------------------
PID NOT NULL NUMBER(4)
PNAME VARCHAR2(20)
PSEX CHAR(2)
SQL> ALTER TABLE person MODIFY pname NOT NULL;
表已更改。
SQL> DESC person;
名稱 是否為空? 類型
----------------------------------------- -------- ------------------
PID NOT NULL NUMBER(4)
PNAME NOT NULL VARCHAR2(20)
PSEX CHAR(2)
SQL> INSERT INTO person VALUES(1,'aaa','女');
已建立 1 筆。
SQL> INSERT INTO person VALUES(1,'aaa',NULL);
已建立 1 筆。
SQL> INSERT INTO person VALUES(1,NULL,NULL);
INSERT INTO person VALUES(1,NULL,NULL)
*
第 1 行出現錯誤:
ORA-01400: 無法將 NULL 插入 ("SYSTEM"."PERSON"."PNAME")
SQL> ALTER TABLE person MODIFY pname NULL;
表已更改。
SQL> DESC person;
名稱 是否為空? 類型
----------------------------------------- -------- ------------------
PID NOT NULL NUMBER(4)
PNAME VARCHAR2(20)
PSEX CHAR(2)
SQL> INSERT INTO person VALUES(1,NULL,NULL);
已建立 1 筆。
ORA-01400。CONSTRAINT pk_person_pid),利於後續 DROP CONSTRAINT 或查詢 USER_CONSTRAINTS。USER_CONSTRAINTS 中對應記錄會自動消失。掌握以上語法與注意事項,即可靈活控管 Oracle 資料表的非空約束,確保資料品質。