参照scott下的dept(主表),emp(子表),定义如下:
表dept定义
SQL> select dbms_metadata.get_ddl('TABLE','DEPT','SCOTT') from dual;
DBMS_METADATA.GET_DDL('TABLE','DEPT','SCOTT')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13),
CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE
DBMS_METADATA.GET_DDL('TABLE','DEPT','SCOTT')
--------------------------------------------------------------------------------
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS"
--表emp定义
SQL> select dbms_metadata.get_ddl('TABLE','EMP','SCOTT') from dual;
DBMS_METADATA.GET_DDL('TABLE','EMP','SCOTT')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."EMP"
( "EMPNO" NUMBER(4,0),
"ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"MGR" NUMBER(4,0),
"HIREDATE" DATE,
"SAL" NUMBER(7,2),
"COMM" NUMBER(7,2),
"DEPTNO" NUMBER(2,0),
CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
DBMS_METADATA.GET_DDL('TABLE','EMP','SCOTT')
--------------------------------------------------------------------------------
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
DBMS_METADATA.GET_DDL('TABLE','EMP','SCOTT')
--------------------------------------------------------------------------------
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS"
SQL>
一、主-外键约束FK
主-外键约束指的是子表的某一字段的内容取值范围必须由主表指定。
1)创建2张测试表:
create table d1 as select * from dept;
create table e1 as select * from emp;
说明:目前仅仅是复制了表结构及数据,未建立任何约束。
2)在未给d1.deptno创建主键或唯一约束,首选为e1.deptno创建外键:
SQL> alter table e1 add constraint FK_DEPTNO_e1 foreign key (DEPTNO) references d1 (DEPTNO);
alter table e1 add constraint FK_DEPTNO_e1 foreign key (DEPTNO) references d1 (DEPTNO)
*
ERROR at line 1:
ORA-02270: no matching unique or primary key for this column-list
结论:在子表中设置的与父表关联的外键字段时,这个字段在父表中必须具有主键约束或唯一约束才可以设置成功。否则无法设置外键约束。
3)首先为d1.DEPTNO创建主键约束,然后再在e1.DEPTNO设置依赖于d1的外键,即可创建成功。
SQL> alter table d1 add constraint PK_d1 primary key (DEPTNO);
Table altered.
SQL> alter table e1 add constraint FK_DEPTNO_e1 foreign key (DEPTNO) references d1 (DEPTNO);
Table altered.
4)删除d1的约束pk_d1:
--查询:
SQL> select * from d1;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select * from e1 order by deptno asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
13 rows selected.
--操作:
SQL> alter table d1 drop constraint pk_d1;
alter table d1 drop constraint pk_d1
*
ERROR at line 1:
ORA-02273: this unique/primary key is referenced by some foreign keys
结论:若想删除被外键依赖的主键信息时,需要首先删除与其关联的外键,然后再删除主键:
SQL> alter table e1 drop constraint fk_deptno_e1;
Table altered.
SQL> alter table d1 drop constraint pk_d1;
Table altered.
--再次查询:
SQL> select * from d1;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select * from e1 order by deptno asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
13 rows selected.
5)再次设置主外键:首先为d1.DEPTNO创建唯一约束,然后再在e1.DEPTNO设置依赖于d1的外键,即可创建成功。
SQL> alter table d1 add constraint UK_d1 unique(deptno);
Table altered.
SQL> alter table e1 add constraint FK_DEPTNO_e1 foreign key (DEPTNO) references d1 (DEPTNO);
Table altered.
6)与步骤4相同:
SQL> alter table d1 drop constraint uk_d1;
alter table d1 drop constraint uk_d1
*
ERROR at line 1:
ORA-02273: this unique/primary key is referenced by some foreign keys
--删除外键
SQL> alter table e1 drop constraint fk_deptno_e1;
Table altered.
--删除主键
SQL> alter table d1 drop constraint uk_d1;
Table altered.
SQL> select * from d1;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select * from e1 order by deptno asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
13 rows selected.
7)总结:外键依赖于父表字段的主键约束或唯一约束,有外键约束时,如果想删除主键或唯一约束需要先删除其外键约束。
8)针对于父表的delete或drop操作,如存在依赖关系需要首先处理子表数据,然后再处理父表数据。
9)针对于对父表的delete操作,外键设置on delete cascade:
drop table d1 purge;
drop table e1 purge;
create table d1 as select * from dept;
create table e1 as select * from emp;
alter table d1 add constraint PK_d1 primary key (DEPTNO);
alter table e1 add constraint FK_DEPTNO_e1 foreign key (DEPTNO) references d1 (DEPTNO) on delete cascade;
--查询现在d1和e1表的数据:
SQL> select * from d1;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select * from e1 order by deptno asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
13 rows selected.
--删除d1表中10部门数据:
SQL> delete from d1 where deptno=10;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select * from d1;
DEPTNO DNAME LOC
---------- -------------- -------------
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select * from e1 order by deptno asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
10 rows selected.
结论:在外键中使用on delete cascade时,删除父表的数据时会同时删除与父表数据相关联的子表数据。
10)针对于对父表的delete操作,外键设置on delete set null:
drop table e1 purge;
drop table d1 purge;
create table d1 as select * from dept;
create table e1 as select * from emp;
alter table d1 add constraint PK_d1 primary key (DEPTNO);
alter table e1 add constraint FK_DEPTNO_e1 foreign key (DEPTNO) references d1 (DEPTNO) on delete set null;
--查询d1和e1现在数据:
SQL> select * from d1;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select * from e1 order by deptno asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
13 rows selected.
--删除d1表中10部门的数据:
SQL> delete from d1 where deptno=10;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select * from d1;
DEPTNO DNAME LOC
---------- -------------- -------------
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select * from e1 order by deptno asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7839 KING PRESIDENT 17-NOV-81 5000
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7934 MILLER CLERK 7782 23-JAN-82 1300
7782 CLARK MANAGER 7839 09-JUN-81 2450
13 rows selected.
发现dept=10的值变为null了
结论:在外键关联中使用on delete set null时,删除父表数据并不会同时删除与之关联的子表数据,而是将外键关联字段自动修改成null。
11)外键管理存在时,drop父表操作:
drop table e1 purge;
drop table d1 purge;
create table d1 as select * from dept;
create table e1 as select * from emp;
alter table d1 add constraint PK_d1 primary key (DEPTNO);
alter table e1 add constraint FK_DEPTNO_e1 foreign key (DEPTNO) references d1 (DEPTNO);
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE from user_constraints where table_name in ('E1','D1');
TABLE_NAME CONSTRAINT_NAME C
------------------------------ ------------------------------ -
D1 PK_D1 P
E1 FK_DEPTNO_E1 R
--删除d1表:
SQL> drop table d1;
drop table d1
*
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys
--使用drop table table_name cascade constraint子句删除:
SQL> drop table d1 cascade constraint;
Table dropped.
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE from user_constraints where table_name in ('E1','D1');
no rows selected
--查询
SQL> select * from d1;
select * from d1
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select * from e1 order by deptno asc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
13 rows selected.
结论:在drop父表时,如果使用cascade constraint时,会删除父表同时删除子表的外键约束信息,但是不会删除子表信息。
二、修改约束
1、为表add约束:
>语法:alter table table_name add constraint
创建测试表:
drop table e1 purge;
drop table d1 purge;
create table d1 as select * from dept;
create table e1 as select * from emp;
alter table d1 add constraint PK_d1 primary key (DEPTNO);
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE from user_constraints where table_name in ('E1');
no rows selected
此时e1表没有任何字段。
1)为表e1.EMP添加主键约束:
SQL> alter table e1 add constraint pk_e1 primary key (empno);
Table altered.
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C
------------------------------ ------------------------------ -
E1 PK_E1 P
2)为表e1.SAL增加检查约束:在表中add约束时首先要保证已有数据没有违反约束。
SQL> alter table e1 add constraint ck_e1 check(sal > 100);
Table altered.
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C
------------------------------ ------------------------------ -
E1 PK_E1 P
E1 CK_E1 C
3)增加外键约束:
SQL> alter table e1 add constraint fk_e1 foreign key(deptno) references d1(deptno);
Table altered.
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C
------------------------------ ------------------------------ -
E1 PK_E1 P
E1 CK_E1 C
E1 FK_E1 R
4)增加唯一约束:
SQL> alter table e1 add constraint uk_e1 unique(ename);
Table altered.
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C
------------------------------ ------------------------------ -
E1 PK_E1 P
E1 CK_E1 C
E1 FK_E1 R
E1 UK_E1 U
5)增加非空约束:不能通过alter table table_name add constraint命令添加,只能通过修改表的方式增加:
SQL> alter table e1 modify(SAL NUMBER(7,2) not null);
Table altered.
SQL> set lines 200
SQL> col owner for a10
SQL> col TABLE_NAME for a15
SQL> col SEARCH_CONDITION for a25
SQL> col column_name for a15
SQL> col index_owner for a10
SQL> col index_name for a15
SQL> col CONSTRAINT_NAME for a15
SQL> select a.OWNER,
2 a.TABLE_NAME,
3 a.CONSTRAINT_NAME,
4 a.CONSTRAINT_TYPE,
5 a.SEARCH_CONDITION,
6 a.STATUS,
7 a.INVALID,
8 a.INDEX_OWNER,
9 a.INDEX_NAME,
10 b.CONSTRAINT_NAME,
11 b.COLUMN_NAME
12 from dba_constraints a, dba_cons_columns b
13 where a.owner = b.owner and a.owner='SCOTT'
14 and a.TABLE_NAME = b.TABLE_NAME and A.TABLE_NAME='E1';
OWNER TABLE_NAME CONSTRAINT_NAME C SEARCH_CONDITION STATUS INVALID INDEX_OWNE INDEX_NAME CONSTRAINT_NAME COLUMN_NAME
---------- --------------- --------------- - ------------------------- -------- ------- ---------- --------------- --------------- ---------------
SCOTT E1 PK_E1 P ENABLED SCOTT PK_E1 PK_E1 EMPNO
SCOTT E1 PK_E1 P ENABLED SCOTT PK_E1 CK_E1 SAL
SCOTT E1 PK_E1 P ENABLED SCOTT PK_E1 FK_E1 DEPTNO
SCOTT E1 PK_E1 P ENABLED SCOTT PK_E1 UK_E1 ENAME
SCOTT E1 PK_E1 P ENABLED SCOTT PK_E1 SYS_C0012368 SAL
SCOTT E1 CK_E1 C sal > 100 ENABLED PK_E1 EMPNO
SCOTT E1 CK_E1 C sal > 100 ENABLED CK_E1 SAL
SCOTT E1 CK_E1 C sal > 100 ENABLED FK_E1 DEPTNO
SCOTT E1 CK_E1 C sal > 100 ENABLED UK_E1 ENAME
SCOTT E1 CK_E1 C sal > 100 ENABLED SYS_C0012368 SAL
SCOTT E1 FK_E1 R ENABLED PK_E1 EMPNO
OWNER TABLE_NAME CONSTRAINT_NAME C SEARCH_CONDITION STATUS INVALID INDEX_OWNE INDEX_NAME CONSTRAINT_NAME COLUMN_NAME
---------- --------------- --------------- - ------------------------- -------- ------- ---------- --------------- --------------- ---------------
SCOTT E1 FK_E1 R ENABLED CK_E1 SAL
SCOTT E1 FK_E1 R ENABLED FK_E1 DEPTNO
SCOTT E1 FK_E1 R ENABLED UK_E1 ENAME
SCOTT E1 FK_E1 R ENABLED SYS_C0012368 SAL
SCOTT E1 UK_E1 U ENABLED SCOTT UK_E1 PK_E1 EMPNO
SCOTT E1 UK_E1 U ENABLED SCOTT UK_E1 CK_E1 SAL
SCOTT E1 UK_E1 U ENABLED SCOTT UK_E1 FK_E1 DEPTNO
SCOTT E1 UK_E1 U ENABLED SCOTT UK_E1 UK_E1 ENAME
SCOTT E1 UK_E1 U ENABLED SCOTT UK_E1 SYS_C0012368 SAL
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED PK_E1 EMPNO
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED CK_E1 SAL
OWNER TABLE_NAME CONSTRAINT_NAME C SEARCH_CONDITION STATUS INVALID INDEX_OWNE INDEX_NAME CONSTRAINT_NAME COLUMN_NAME
---------- --------------- --------------- - ------------------------- -------- ------- ---------- --------------- --------------- ---------------
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED FK_E1 DEPTNO
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED UK_E1 ENAME
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED SYS_C0012368 SAL
25 rows selected.
2、启用/禁用约束
>禁用约束语法:alter table table_name disable constraint cons_name [cascade];
>启用约束语法:alter table table_name enable constraint cons_name;
1)禁用表e1的约束
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
E1 PK_E1 P ENABLED
E1 CK_E1 C ENABLED
E1 FK_E1 R ENABLED
E1 UK_E1 U ENABLED
E1 SYS_C0012368 C ENABLED
--禁用约束
SQL> ALTER TABLE e1 DISABLE CONSTRAINT CK_e1;
Table altered.
SQL> ALTER TABLE e1 DISABLE CONSTRAINT UK_e1;
Table altered.
SQL> ALTER TABLE e1 DISABLE CONSTRAINT PK_e1;
Table altered.
SQL> ALTER TABLE e1 DISABLE CONSTRAINT FK_e1;
Table altered.
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
E1 PK_E1 P DISABLED
E1 CK_E1 C DISABLED
E1 FK_E1 R DISABLED
E1 UK_E1 U DISABLED
E1 SYS_C0012368 C ENABLED
--再次查询
SQL> select a.OWNER,
2 a.TABLE_NAME,
3 a.CONSTRAINT_NAME,
4 a.CONSTRAINT_TYPE,
5 a.SEARCH_CONDITION,
6 a.STATUS,
7 a.INVALID,
8 a.INDEX_OWNER,
9 a.INDEX_NAME,
10 b.CONSTRAINT_NAME,
11 b.COLUMN_NAME
12 from dba_constraints a, dba_cons_columns b
13 where a.owner = b.owner and a.owner='SCOTT'
14 and a.TABLE_NAME = b.TABLE_NAME and A.TABLE_NAME='E1';
OWNER TABLE_NAME CONSTRAINT_NAME C SEARCH_CONDITION STATUS INVALID INDEX_OWNE INDEX_NAME CONSTRAINT_NAME COLUMN_NAME
---------- --------------- --------------- - ------------------------- -------- ------- ---------- --------------- --------------- ---------------
SCOTT E1 PK_E1 P DISABLED PK_E1 EMPNO
SCOTT E1 PK_E1 P DISABLED CK_E1 SAL
SCOTT E1 PK_E1 P DISABLED FK_E1 DEPTNO
SCOTT E1 PK_E1 P DISABLED UK_E1 ENAME
SCOTT E1 PK_E1 P DISABLED SYS_C0012368 SAL
SCOTT E1 CK_E1 C sal > 100 DISABLED PK_E1 EMPNO
SCOTT E1 CK_E1 C sal > 100 DISABLED CK_E1 SAL
SCOTT E1 CK_E1 C sal > 100 DISABLED FK_E1 DEPTNO
SCOTT E1 CK_E1 C sal > 100 DISABLED UK_E1 ENAME
SCOTT E1 CK_E1 C sal > 100 DISABLED SYS_C0012368 SAL
SCOTT E1 FK_E1 R DISABLED PK_E1 EMPNO
OWNER TABLE_NAME CONSTRAINT_NAME C SEARCH_CONDITION STATUS INVALID INDEX_OWNE INDEX_NAME CONSTRAINT_NAME COLUMN_NAME
---------- --------------- --------------- - ------------------------- -------- ------- ---------- --------------- --------------- ---------------
SCOTT E1 FK_E1 R DISABLED CK_E1 SAL
SCOTT E1 FK_E1 R DISABLED FK_E1 DEPTNO
SCOTT E1 FK_E1 R DISABLED UK_E1 ENAME
SCOTT E1 FK_E1 R DISABLED SYS_C0012368 SAL
SCOTT E1 UK_E1 U DISABLED PK_E1 EMPNO
SCOTT E1 UK_E1 U DISABLED CK_E1 SAL
SCOTT E1 UK_E1 U DISABLED FK_E1 DEPTNO
SCOTT E1 UK_E1 U DISABLED UK_E1 ENAME
SCOTT E1 UK_E1 U DISABLED SYS_C0012368 SAL
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED PK_E1 EMPNO
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED CK_E1 SAL
OWNER TABLE_NAME CONSTRAINT_NAME C SEARCH_CONDITION STATUS INVALID INDEX_OWNE INDEX_NAME CONSTRAINT_NAME COLUMN_NAME
---------- --------------- --------------- - ------------------------- -------- ------- ---------- --------------- --------------- ---------------
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED FK_E1 DEPTNO
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED UK_E1 ENAME
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED SYS_C0012368 SAL
25 rows selected.
2)启用表e1约束
SQL> ALTER TABLE e1 ENABLE CONSTRAINT PK_e1;
Table altered.
SQL> ALTER TABLE e1 ENABLE CONSTRAINT CK_e1;
Table altered.
SQL> ALTER TABLE e1 ENABLE CONSTRAINT UK_e1;
Table altered.
SQL> ALTER TABLE e1 ENABLE CONSTRAINT FK_e1;
Table altered.
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
E1 PK_E1 P ENABLED
E1 CK_E1 C ENABLED
E1 FK_E1 R ENABLED
E1 UK_E1 U ENABLED
E1 SYS_C0012368 C ENABLED
SQL> select a.OWNER,
a.TABLE_NAME,
2 3 a.CONSTRAINT_NAME,
4 a.CONSTRAINT_TYPE,
5 a.SEARCH_CONDITION,
6 a.STATUS,
7 a.INVALID,
8 a.INDEX_OWNER,
9 a.INDEX_NAME,
10 b.CONSTRAINT_NAME,
11 b.COLUMN_NAME
12 from dba_constraints a, dba_cons_columns b
13 where a.owner = b.owner and a.owner='SCOTT'
14 and a.TABLE_NAME = b.TABLE_NAME and A.TABLE_NAME='E1';
OWNER TABLE_NAME CONSTRAINT_NAME C SEARCH_CONDITION STATUS INVALID INDEX_OWNE INDEX_NAME CONSTRAINT_NAME COLUMN_NAME
---------- --------------- --------------- - ------------------------- -------- ------- ---------- --------------- --------------- ---------------
SCOTT E1 PK_E1 P ENABLED SCOTT PK_E1 PK_E1 EMPNO
SCOTT E1 PK_E1 P ENABLED SCOTT PK_E1 CK_E1 SAL
SCOTT E1 PK_E1 P ENABLED SCOTT PK_E1 FK_E1 DEPTNO
SCOTT E1 PK_E1 P ENABLED SCOTT PK_E1 UK_E1 ENAME
SCOTT E1 PK_E1 P ENABLED SCOTT PK_E1 SYS_C0012368 SAL
SCOTT E1 CK_E1 C sal > 100 ENABLED PK_E1 EMPNO
SCOTT E1 CK_E1 C sal > 100 ENABLED CK_E1 SAL
SCOTT E1 CK_E1 C sal > 100 ENABLED FK_E1 DEPTNO
SCOTT E1 CK_E1 C sal > 100 ENABLED UK_E1 ENAME
SCOTT E1 CK_E1 C sal > 100 ENABLED SYS_C0012368 SAL
SCOTT E1 FK_E1 R ENABLED PK_E1 EMPNO
OWNER TABLE_NAME CONSTRAINT_NAME C SEARCH_CONDITION STATUS INVALID INDEX_OWNE INDEX_NAME CONSTRAINT_NAME COLUMN_NAME
---------- --------------- --------------- - ------------------------- -------- ------- ---------- --------------- --------------- ---------------
SCOTT E1 FK_E1 R ENABLED CK_E1 SAL
SCOTT E1 FK_E1 R ENABLED FK_E1 DEPTNO
SCOTT E1 FK_E1 R ENABLED UK_E1 ENAME
SCOTT E1 FK_E1 R ENABLED SYS_C0012368 SAL
SCOTT E1 UK_E1 U ENABLED SCOTT UK_E1 PK_E1 EMPNO
SCOTT E1 UK_E1 U ENABLED SCOTT UK_E1 CK_E1 SAL
SCOTT E1 UK_E1 U ENABLED SCOTT UK_E1 FK_E1 DEPTNO
SCOTT E1 UK_E1 U ENABLED SCOTT UK_E1 UK_E1 ENAME
SCOTT E1 UK_E1 U ENABLED SCOTT UK_E1 SYS_C0012368 SAL
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED PK_E1 EMPNO
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED CK_E1 SAL
OWNER TABLE_NAME CONSTRAINT_NAME C SEARCH_CONDITION STATUS INVALID INDEX_OWNE INDEX_NAME CONSTRAINT_NAME COLUMN_NAME
---------- --------------- --------------- - ------------------------- -------- ------- ---------- --------------- --------------- ---------------
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED FK_E1 DEPTNO
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED UK_E1 ENAME
SCOTT E1 SYS_C0012368 C "SAL" IS NOT NULL ENABLED SYS_C0012368 SAL
25 rows selected.
3)禁用d1表上的pk_d1约束
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
E1 PK_E1 P ENABLED
E1 CK_E1 C ENABLED
E1 FK_E1 R ENABLED
E1 UK_E1 U ENABLED
E1 SYS_C0012368 C ENABLED
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('D1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
D1 PK_D1 P ENABLED
SQL> ALTER TABLE d1 DISABLE CONSTRAINT PK_d1;
ALTER TABLE d1 DISABLE CONSTRAINT PK_d1
*
ERROR at line 1:
ORA-02297: cannot disable constraint (SCOTT.PK_D1) - dependencies exist
注意:此处因为PK_d1存在外键约束,所以禁止禁用PK_d1约束。
--使用语法ALTER TABLE table_name DISABLE CONSTRAINT cons_name CASCADE;
SQL> ALTER TABLE d1 DISABLE CONSTRAINT PK_d1 CASCADE;
Table altered.
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
E1 PK_E1 P ENABLED
E1 CK_E1 C ENABLED
E1 FK_E1 R DISABLED
E1 UK_E1 U ENABLED
E1 SYS_C0012368 C ENABLED
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('D1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
D1 PK_D1 P DISABLED
注意:禁用父表带有外键的约束时,可以采用cascade方式禁用约束,该方式同时也会禁用掉子表的外键约束。
3、删除约束:
语法:alter table table_name drop constraint cons_name [cascade];
1)删除e1中非外键约束
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
E1 PK_E1 P ENABLED
E1 CK_E1 C ENABLED
E1 FK_E1 R DISABLED
E1 UK_E1 U ENABLED
E1 SYS_C0012368 C ENABLED
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('D1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
D1 PK_D1 P DISABLED
SQL> ALTER TABLE e1 DROP CONSTRAINT CK_e1;
Table altered.
SQL> ALTER TABLE e1 DROP CONSTRAINT UK_e1;
Table altered.
SQL> ALTER TABLE e1 DROP CONSTRAINT PK_e1;
Table altered.
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
E1 FK_E1 R DISABLED
E1 SYS_C0012368 C ENABLED
2)删除d1表中的pk_d1约束
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
E1 FK_E1 R DISABLED
E1 SYS_C0012368 C ENABLED
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('D1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
D1 PK_D1 P DISABLED
SQL> alter table D1 enable constraint PK_D1;
Table altered.
SQL> alter table e1 enable constraint FK_E1;
Table altered.
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
E1 FK_E1 R ENABLED
E1 SYS_C0012368 C ENABLED
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('D1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
D1 PK_D1 P ENABLED
SQL> ALTER TABLE d1 DROP CONSTRAINT PK_d1;
ALTER TABLE d1 DROP CONSTRAINT PK_d1
*
ERROR at line 1:
ORA-02273: this unique/primary key is referenced by some foreign keys
注意:不允许删除带有外键约束的主表约束。
--使用ALTER TABLE tab_name DROP CONSTRAINT cons_name CASCADE删除,如下:
SQL> ALTER TABLE d1 DROP CONSTRAINT PK_d1 CASCADE;
Table altered.
--查询:
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('E1');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
E1 SYS_C0012368 C ENABLED
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('D1');
no rows selected
注意:cascade删除父表约束时,会同时删除子表约束。
三、查看约束信息:
通过dba_constraint和dba_cons_columns字典表查询约束信息,同时也以此字典表为基础编写约束日常监控脚本:
>CONSTRAINT_TYPE类型:P、R、C、C(not null)
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('EMP');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
EMP PK_EMP P ENABLED
EMP FK_DEPTNO R ENABLED
SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS from user_constraints where table_name in ('DEPT');
TABLE_NAME CONSTRAINT_NAME C STATUS
--------------- --------------- - --------
DEPT PK_DEPT P ENABLED
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31397003/viewspace-2155606/
,如需转载,请注明出处,否则将追究法律责任。