在本教程中,您将学习如何使用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
值。