sql server中的外码和级联
问题
定义了三个表GOODS、PLAZA、SALE,其中SALE表的主码为外码参考GOODS表和PLAZA的主码。
create table GOODS(
GNAME char(20) primary key,
GTYPE char(10)
);
create table PLAZA(
PNAME char(20) primary key,
PAREA char(20)
);
create table SALE(
GNAME char(20),
PNAME char(20),
PRICE FLOAT,
ATYPE int,
primary key(GNAME,PNAME),
foreign key (GNAME) references GOODS(GNAME) ,
foreign key (PNAME) references PLAZA(PNAME)
)
插入表格后,如果删除GOODS或者PLAZA中的数据的话,会出现无法删除的情况,是因为在定义外码时,没有定义级联约束。
解决办法
1.重新定义表
重新定义表,在创建表时加入约束。但这样会导致前面导入的数据丢失,记得做好备份。
先删除先前定义的三个表,加入如下代码
create table GOODS(
GNAME char(20) primary key,
GTYPE char(10)
);
create table PLAZA(
PNAME char(20) primary key,
PAREA char(20)
);
create table SALE(
GNAME char(20),
PNAME char(20),
PRICE FLOAT,
ATYPE int,
primary key(GNAME,PNAME),
foreign key (GNAME) references GOODS(GNAME) on delete cascade,
foreign key (PNAME) references PLAZA(PNAME) on delete cascade
)
2.加入新的约束
在sql server中,对已经生成的的表有添加新的约束的定义。因此,可以不必删除原来的表,只是进行新的约束的定义。
新的约束的名称分别为SALE_GNAME_REFERENCES_GOODS_GNAME和SALE_PNAME_REFERENCES_PLAZA_PNAME
add constraint SALE_GNAME_REFERENCES_GOODS_GNAME foreign key (GNAME) references GOODS(GNAME) on delete cascade;
add constraint SALE_PNAME_REFERENCES_PLAZA_PNAME foreign key (PNAME) references PLAZA(PNAME) on delete cascade;