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

  • 主题发起人 主题发起人 Beast
  • 开始时间 开始时间
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了。这样安全性高一些,而且可维护性会比较强。
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
877
DelphiTeacher的专栏
D
D
回复
0
查看
845
DelphiTeacher的专栏
D
D
回复
0
查看
795
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部