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(是否采用延迟)。