sql server中的外码和级联

来源:互联网 发布:宏图高科股票,知乎 编辑:程序博客网 时间:2024/06/02 03:26

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;

结束

0 0