在本教學中,您將學習如何使用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
值。
以下宣告建立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
約束的列以接受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
值。