Oracle Not Null約束


在本教學中,您將學習如何使用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值。