Oracle Not Null约束

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值。