SQL-Server 中外键定义的问题(100分)

B

Beast

Unregistered / Unconfirmed
GUEST, unregistred user!
我在数据库中建立了若干张数据表,使用外键管理实现级联删除。
A表:
aid
B表:
bid
aid
C表:
cid
aid
现已经定义:
外键1:B表,主键bid,外键aid
外键2:C表,主键cid,外键aid

现在想定义一外键:
C表:主键cid,外键bid,但是SQL-Servre不允许这样的外键
我的意思是想删除A表记录是级联删除B表和C表的aid相同的记录,同时删除B表时级联删除C表cid和B表bid相同的记录。
怎么实现哦??
 
这个跟定义外件是没有关系的,用触发器
如 A表定义一个删除触发器,在其中先删除B表中ID相同的记录:

delete * From B Where bID = deleted.cid
 
我就是不想使用触发器,才使用外键约束进行级联删除的!
 
把aid设为bid的外键,bid设为cid的外键。这样就能达到你的要求。
不需要把aid设成cid的外键。
从你的描述来看bid和aid是一一对应的关系吧!
如果bid如果是cid的外键,那么aid一定是cid的外键。
所以我所说的设置方法在删除aid的同时也能够删除cid的。
cid的值一定在bid中存在,而bid的值一定在aid中存在,因此cid的值一定在aid中存在。
这就是为什么SQLServer不让你设置这样的外键,因为是多余的。
 
咳!
是我没有说清楚,我就不乱抽象了,是这样的:
=======================
合同表:
合同ID
周期表:
周期ID
合同ID(外键)
合同某类项目定义表:
项目ID-A
合同ID(外键)
合同某类项目计量表:
主键ID
项目ID-B(外键)
周期ID(外键)
==================
要求是这样的:
1、从“合同表”删除“合同”,则从“周期表”删除“周期”;
2、从“合同表”删除“合同”,则从“合同某项目定义表”删除“项目”;
3、从“周期表”删除“周期”,则从“合同某项目计量表”删除“项目”;
4、从“合同某项目定义表”删除“项目”,则从“合同某项目计量表”删除“项目”;
就是上面的需求了。
我想了3天了,实在没有办法,诸位帮忙!谢!!
 
合同表 a:
aid
周期表 b:
bid
aid (外键)
合同某类项目定义表 c:
cid
aid (外键)
合同某类项目计量表 d:
did
cid (外键)
bid (外键)
这样SQL Server不行?
刚才在access下试了一下 可以的 我去SQL Server下试试看
 
不是定义外键不行,而是级联删除不行~~
仅仅定义外键是可以的。
 
access下级联删除也行。但是SQL Server下确实不可以。
只好用触发器做了。没办法了。
 
你看看关系数据库的关系的含义。
你的关系设计不妥
 
如何不妥?还望见教,若是依楼上仁兄意思应该如何设计?
 
啊扑 求分
 
SQL绝对可以实现级联删除,还可以实现级联更新
create table a1(id int primary key ,name varchar(20))
create table a2(id int references a1(id) on delete cascade,qty int)
 
楼上兄弟根本就没有看问题,这样回答太不负责人了
 
我的意思是想删除A表记录是级联删除B表和C表的aid相同的记录,
同时删除B表时级联删除C表cid和B表bid相同的记录。

也不能说大伙不负责,你看你这句话有多长,小弟高度近视噢。
再说你的表设计成这样,还有什么好说的

表:
aid
B表:
bid
aid
C表:
cid
aid
现已经定义:
外键1:B表,主键bid,外键aid
外键2:C表,主键cid,外键aid

 
不是说大伙,是说你,哈哈哈~~
你根本没有看上面的发言就随口说话,不负责任^_^
 
不建议用触发器,会有你意想不到的问题,用SP,自已写几句Delete,加上参数控制就ok了。这样安全性高一些,而且可维护性会比较强。
 
多人接受答案了。
 
顶部