在本教學中,您將學習如何使用Oracle NOT NULL約束強制列不接受NULL值。
Oracle NOT NULL約束指定列不能包含NULL值。 Oracle NOT NULL約束是通常在CREATE TABLE語句的列定義中使用的內聯約束。
CREATE TABLE table_name (
...
column_name data_type NOT NULL
...
);
可以通過使用ALTER TABLE語句將NOT NULL約束添加到現有表。
ALTER TABLE table_name MODIFY ( column_name NOT NULL);
在個語句中,在應用NOT NULL約束之後,column_name不能包含任何NULL值。
Oracle NOT NULL示例
以下聲明創建surcharges表:
CREATE TABLE surcharges (
surcharge_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
surcharge_name VARCHAR2(255) NOT NULL,
amount NUMBER(9,2),
PRIMARY KEY (surcharge_id)
);
surcharges表有三列:附加費用,附加費名稱和金額。
surcharge_id列是由PRIMARY KEY約束指定的表的主鍵列,因此,Oracle向該列隱式添加NOT NULL約束。
surcharge_name列具有在列定義中顯式指定的NOT NULL約束。amount列可以接受NULL值。
以下語句在surcharges表中插入一行:
INSERT INTO surcharges(surcharge_name, amount)
VALUES('Late order placement',10);
它按預期工作。
但是,以下語句不起作用:
INSERT INTO surcharges(surcharge_name, amount)
VALUES(null,20);
因為它試圖將NULL值插入到具有NOT NULL約束的surcharge_name列中。
以下語句可以正常工作,因為amount列接受NULL值:
INSERT INTO surcharges(surcharge_name, amount)
VALUES('Rush Order',NULL);
以下語句顯示surcharges表的所有約束條件:
SELECT
table_name,
constraint_name,
search_condition
FROM
user_constraints
WHERE
table_name = 'SURCHARGES';
如果要將NOT NULL約束添加到amount列,請使用以下ALTER TABLE語句:
ALTER TABLE surcharges MODIFY (amount NOT NULL);
發生類似以下錯誤:
SQL Error: ORA-02296: cannot enable (OT.) - null values found
因為surcharges表的數據記錄中已經有一行包含NULL值。
因此,在添加NOT NULL約束之前,您需要確保附件表中的現有數據不違反NOT NULL約束:
UPDATE
surcharges
SET
amount = 0
WHERE
amount IS NULL;
現在,如果再次執行ALTER TABLE語句:
ALTER TABLE surcharges MODIFY (amount NOT NULL);
它應該按預期工作。
刪除NOT NULL約束
有時,需要更改具有NOT NULL約束的列以接受NULL值。
為此,需要使用ALTER TABLE語句從列中刪除NOT NULL約束,如下所示:
ALTER TABLE table_name MODIFY ( column_name NULL)
例如,要從surcharges表的金額列中刪除NOT NULL約束,請使用以下語句:
ALTER TABLE surcharges
MODIFY (amount NULL);
在本教學中,您已學習如何使用Oracle NOT NULL約束強制列不接受NULL值。
