- 信息查询
SELECT * FROM dba_cons_columns;
和
SELECT constraint_name, table_name, constraint_type, status, deferrable, deferred, validated FROM dba_constraints; - 变更约束执行时间(是否延缓执行,只对可延缓约束有效)
SET CONSTRAINTS xxx IMMEDIATE; --立即
或
SET CONSTRAINTS xxx DEFERRED; --延缓 - 添加约束
ALTER TABLE xxx.yyy ADD CONSTRAINT event_evtid_pk PRIMARY_KEY (evtid) [DEFERRABLE [initially deferred]] USING INDEX STROAGE(INITIAL 300K NEXT 300K) TABLESPACE ccc; - 改变约束状态
ALTER TABLE xxx.yyy ENABLE|DISABLE VALIDATE|NOVALIDATE CONSTRAINT ccc; - 利用官方提供的system.Exceptions表查找违反约束的地方.
a.) 如果没有该表,运行$ORACLE_HOME/rdbms/admin目录下的utlexpt1.sql进行创建
例如: @D:/Tools/oracle/product/10.2.0/db_1/RDBMS/ADMIN/utlexpt1.sql
b.)执行语句是加上以下后缀: EXCEPTIONS INTO system.exceptions, 如:
ALTER TABLE scott.emp DISABLE NOVALIDATE CONSTRAINT PK_EMP;
INSERT INTO scott.emp(empno) VALUES (7788);
ALTER TABLE scott.emp ENABLE VALIDATE CONSTRAINT PK_EMP EXCEPTIONS INTO system.exceptions;
此时使用以下查询即可以找出问题:
SELECT rowid, this.* FROM scott.emp this WHERE ROWID IN (SELECT row_id FROM exceptions);
通过查询出来的rowid找到问题并解决之后,即可以改变约束状态了. - 重命名约束
ALTER TABLE xxx.yyy RENAME CONSTRAINT ccc TO ccc_new; - 删除约束
ALTER TABLE xxx.yyy DROP CONSTRAINT ccc [CASCADE];