1. Check 约束

Check 约束用于确保表中的列满足特定的条件。例如,限制某个字段只能取特定值:

CREATE TABLE order_status ( id INTEGER CONSTRAINT order_status_pk PRIMARY KEY, status VARCHAR(120), last_modified DATE DEFAULT SYSDATE ); ALTER TABLE order_status ADD CONSTRAINT order_status_ck CHECK (status IN ('BeiJing', 'ShangHai', 'TaiWan')); ALTER TABLE order_status ADD CONSTRAINT order_status_id_ck CHECK (id > 10); 

注意:在创建 Check 约束时,表中已存在的所有数据必须满足新的约束条件。如果不满足,将引发 ORA-02293 错误。

2. Not Null 约束

Not Null 约束用于确保某列不能为空。可以通过以下方式添加 Not Null 约束:

ALTER TABLE order_status MODIFY status CONSTRAINT order_status_newref NOT NULL; ALTER TABLE order_status MODIFY last_modified NOT NULL; 

注意:添加 Not Null 约束时,建议手动指定约束名称,以便于错误定位。

3. Foreign Key 外键约束

Foreign Key 约束用于确保一个表中的列引用另一个表中的主键。例如:

CREATE GLOBAL TEMPORARY TABLE test_orderstatus ( id INTEGER CONSTRAINT order_statustest_pk PRIMARY KEY, status_id NUMBER(15), status VARCHAR(120), last_modified DATE DEFAULT SYSDATE ); ALTER TABLE test_orderstatus ADD CONSTRAINT order_status_modify_fk FOREIGN KEY (status_id) REFERENCES order_status(id); 

可以使用 ON DELETE CASCADE 子句,当父表中的记录被删除时,自动删除子表中相关的记录:

ALTER TABLE test_orderstatus DROP COLUMN status_id; ALTER TABLE test_orderstatus ADD CONSTRAINT order_status_modify_fk FOREIGN KEY (status_id) REFERENCES order_status(id) ON DELETE CASCADE; 

此外,可以使用 ON DELETE SET NULL 子句,将子表中相关记录的外键字段设为空:

ALTER TABLE test_orderstatus ADD CONSTRAINT order_status_modify_fk FOREIGN KEY (status_id) REFERENCES order_status(id) ON DELETE SET NULL; 

4. Unique 约束

Unique 约束用于确保某列或多列的组合值是唯一的。例如:

ALTER TABLE order_status ADD CONSTRAINT order_status_uq UNIQUE (status); 

5. 删除约束

可以使用以下命令删除已有的约束:

ALTER TABLE order_status DROP CONSTRAINT order_status_uq; 

6. 禁用和启用约束

可以在创建约束时禁用它,也可以在创建后禁用或启用:

ALTER TABLE order_status ADD CONSTRAINT order_status_uq UNIQUE (status) DISABLE; ALTER TABLE order_status DISABLE CONSTRAINT order_status_uq; ALTER TABLE order_status ENABLE CONSTRAINT order_status_uq; 

如果只想对新插入的数据应用约束,可以使用 ENABLE NOVALIDATE 子句:

ALTER TABLE order_status ENABLE NOVALIDATE CONSTRAINT order_status_uq; 

7. 延迟约束

延迟约束在事务提交时才进行验证。可以通过以下方式创建延迟约束:

ALTER TABLE order_status DROP CONSTRAINT order_status_uq; ALTER TABLE order_status ADD CONSTRAINT order_status_uq UNIQUE (status) DEFERRABLE INITIALLY DEFERRED; 

注意:延迟约束一旦创建,无法修改为非延迟约束,只能删除并重新创建。

8. 获取约束信息

可以通过查询 USER_CONSTRAINTS 表来获取关于约束的系统信息:

SELECT * FROM user_constraints WHERE table_name = 'ORDER_STATUS'; 

常见的字段包括:OWNER(约束所有者)、CONSTRAINT_NAME(约束名称)、CONSTRAINT_TYPE(约束类型)、TABLE_NAME(约束定义针对的表名)、STATUS(约束状态)、DEFERRABLE(是否为延迟约束)、DEFERRED(是否采用延迟)。