测试以两个外键为复合主键的表,两个外键空值情况
多表关联的情况下,删除主表的一条数据,同时修改与主表关联的从表对应数据,如 tbl_a表,tbl_b表,两表交互表tbl_a_b。当tbl_a中的数据某条数据删除时,需要先清除tbl_a_b表中对应的数据才能删除tbl_a中的数据,但有时不想删除tbl_a_b的数据,就需把tbl_a_b中对应的a_id改为一个无价值的值。首先想到的就是null。
建表tbl_a:
create table tbl_a(a_id int primary key);
新增测试数据:
insert into tbl_a values(1);
insert into tbl_a values(2);
建表tbl_b
create table tbl_b(b_id int primary key);
新增测试数据:
insert into tbl_b values(10);
insert into tbl_b values(9);
建tbl_a和tbl_b的交互表tbl_a_b:
create table tbl_a_b(
a_id int,
b_id int,
constraint FK_a foreign key(a_id) references tbl_a(a_id),
constraint FK_b foreign key(b_id) references tbl_b(b_id),
constraint PK_key_a_b primary key(a_id,b_id)
);
1.交互表tbl_a_b新增a_id,b_id不为空的数据:
insert into tbl_a_b values(1,10);
新增成功。
2.交互表tbl_a_b新增a_id为空的数据:
insert into tbl_a_b values(null,10);
报错:ORA-01400 a_id不能为空
3.交互表tbl_a_b修改a_id改为null的为空的数据:
update tbl_a_b set a_id=null;
报错:ORA-01407 a_id不能更新为null。
经测试,无法将复合主键中的某一项改为null,只能在tbl_a表与tbl_b表中新增一条无用数据:
insert into tbl_b values(0);
insert into tbl_a values(0);
tbl_a表与tbl_b表每次删除数据时,将tbl_a_b中对应的a_id,b_id 值更新为0.