1、CREATE TABLE “SCOTT“.“MID_A_TAB“( “A“ VARCHAR2(20 BYTE),“B“ VARCHAR2(10 BYTE),“DETPNO“ VARCHAR2(10 BYTE)TABLESPACE “USERS“ ;CREATE TABLE “SCOTT“.“MID_B_TAB“( “A“ VARCHAR2(20 BYTE),“B“ VARCHAR2(10 BYTE),“DEPTNO“ VARCHAR2(10 BYTE)TABLESPACE “USERS“ ;-给 MID_A_TAB 表添加主键alter table mid_a_tab add constrai
2、nt a_pk primary key (detpno);-给 MID_B_TAB 表添加主键alter table mid_b_tab add constraint b_pk primary key(a);-给子表 MID_B_TAB 添加外键,并且引用主表 MID_A_TAB 的 DETPNO 列,并通过 on delete cascade 指定引用行为是级联删除alter table mid_b_tab add constraint b_fk foreign key (deptno) references mid_a_tab (detpno) on delete cascade;-向这样
3、就创建了好子表和主表向主表添加数据记录SQL insert into mid_a_tab(a,b,detpno) values('1','1','10');已创建 1 行。已用时间: 00: 00: 00.00向子表添加数据SQL insert into mid_b_tab(a,b,deptno) values('1','2','6');insert into mid_b_tab values('1','2','6')*第 1 行出现错误:ORA-00
4、001: 违反唯一约束条件 (SCOTT.B_PK)已用时间: 00: 00: 00.00可见上面的异常信息,那时因为子表插入的 deptno 的值是 6,然而此时我们主表中detpno 列只有一条记录那就是 10,所以当子表插入数据时,在父表中不能够找到该引用列的记录,所以出现异常。但我们可以这样对子表的数据的进行插入(即:在子表的 deptno 列插入null,因为我们在建表的时候并没有对该列进行 not null 的约束限制):SQL insert into mid_b_tab(a,b,deptno) values('3','2',null);已创建 1
5、行。已用时间: 00: 00: 00.00现在如果我们把子表 mid_b_tab 中 deptno 列加上 not null 约束。SQL alter table mid_b_tab modify deptno not null;alter table mid_b_tab modify deptno not null*第 1 行出现错误:ORA-02296: 无法启用 (SCOTT.) - 找到空值已用时间: 00: 00: 00.01上面又出现异常,这是因为现在 mid_b_tab 表中有了一条记录,就是我们先前添加的那条记录。3,2,null现在我们要把该表的 deptno 列进行 not
6、 null 约束限制,所以 oracle 不让我们这样干。那我们就只有把该表给 delete 或 truncate 掉,然后在修改 deptno 列为非空。SQL delete from mid_b_tab;已删除 2 行。已用时间: 00: 00: 00.01再次修改子表 mid_b_tab 表的 deptno 列为非空。SQL alter table mid_b_tab modify deptno not null;表已更改。已用时间: 00: 00: 00.01修改成功!我们再次插入数据insert into mid_b_tab(a,b,deptno) values('13
7、9;,'2',null);试试。SQL insert into mid_b_tab(a,b,deptno) values('13','2',null);insert into mid_b_tab(a,b,deptno) values('13','2',null)*第 1 行出现错误:ORA-01400: 无法将 NULL 插入 (“SCOTT“.“MID_B_TAB“.“DEPTNO“)已用时间: 00: 00: 00.00看见现在 oracle 不让我们插入空值了。所以我们在创建子表的外键约束时,该表的引用列必须
8、要进行 not null 限制,也可以在该列创建 unique,或 primary key 约束,并且引用列与被引用列的数据类型必须相同。SQL insert into mid_b_tab(a,b,deptno) values('13','2','10');已创建 1 行。已用时间: 00: 00: 00.01此时数据插入成功,因为此时插入的 10,在主表中的被引用列中已经存在了。现在我们一系列的操作:SQL select * from mid_b_tab ;A B DE- - -13 2 10已用时间: 00: 00: 00.00SQL select * from mid_a_tab;A B DE- - -1 1 10已用时间: 00: 00: 00.00SQL delete from mid_a_tab;已删除 1 行。已用时间: 00: 00: 00.01