我碰到一个奇怪的问题,现在有两个表。一个主表Department,一个从表Person。
从表deptId为外键。
 
按理说,删除主表中的一条记录,从表中的记录也应该删除。
比如,我删除主表中deptId为3的记录,也会删除从表中deptId为3的所有记录。
delete from department where deptid=3
但我用如上语句会报错,
消息 547,级别 16,状态 0,第 1 行
DELETE 语句与 REFERENCE 约束"FK_Person_Department"冲突。该冲突发生于数据库"EmployeeManager",表"dbo.Person", column 'deptId'。
语句已终止。
相反,我删除从表时,主表的相应记录删除了,比如:
delete from person where deptid=3
执行成功,删除了主表,从表中所有deptid为3的记录。这样和预想的刚好相反了?我是根据这个帖子的思想来操作的:
http://blog.csdn.net/QQ10816253/archive/2008/12/29/3637053.aspx我想,应该是删除主表的某条记录,其从表的相应删除。
比如,删除主表部门一,其下属员工全部删除。
如果反过来,删除某个员工,反而把整个部门删除了,那其他的员工不知是哪个部门了

解决方案 »

  1.   


    楼主可能把概念理解错了!由于从表记录参照主表,删除主表记录,从表没了参照,当然会出错啦!可以设置级联删除,解决上面的问题!--> 代码:
    alter table Borrow   
    Add constraint fk_Borrow_BorrowNo 
    Foreign key( BorrowNo) references BoroowList (BNo)
    on update cascade  --级联更新 
    on delete cascade  --级联删除 SQL级联操作设置对SQL数据库的表,进行级联操作(如级联更新及删除),首先需要设置表的主外键关系,有两种方法:第一种:1. 选择你要进行操作的数据库2. 为你要创建关系的两个表设置主键
    3. 在此数据库的数据库关系图一栏处 =>单击右键=>创建新的关系图=>选择要添加关系的表,单击添加4. 完成后会在关系图的窗口上生成两个表,在表的某列按钮上长按鼠标左键,并拖到另一张表上5. 在新弹出的"表和列"的窗口中,设置两个表对应的主外键字段,确定6. 在外键关系窗口中,INSERT 和 UPDATE 规范一栏处,将更新规则和删除规则设置为层叠,点击确定完成,即可实现级联更新 第二种:1. 选择你要进行操作的数据库2. 为你要创建关系的两个表设置主键
    3. 单击你设置外键表的树型节点 =>在键一栏处单击右键=>新建外键4. 在外键关系窗口中,单击表和列规范一栏右边的按钮5. 在新弹出的"表和列"的窗口中,设置两个表对应的主外键字段,确定6. 返回外键关系窗口,在 INSERT 和 UPDATE 规范一栏处,将更新规则和删除规则设置为层叠,点击确定完成,即可实现级联更新 
     
      

  2.   


    不知道你是怎么使用的!参考一下我的...use test
    go
    if object_id('test.dbo.tb1') is not null drop table tb1
    -- 创建数据表
    create table tb1
    (
    id int primary key,
    jno char(3)
    )
    go
    --插入测试数据
    insert into tb1 select 1,'j1'
    union all select 4,'j3'
    union all select 3,'j4'
    go
    if object_id('test.dbo.tb2') is not null drop table tb2
    -- 创建数据表
    create table tb2
    (
    id int,
    jno char(3)
    )
    go
    --插入测试数据
    insert into tb2 select 1,'j1'
    union all select 4,'j3'
    go
    --代码实现
    select * from tb1
    /*
    id jno
    ------------
    1 j1 
    3 j4 
    4 j3 
    */
    select * from tb2
    /*
    id jno
    ------------
    1 j1 
    4 j3 
    */
    --####  添加级联外键约束  ######
    alter table tb2 add constraint id_FK foreign key (id) references tb1(id) on delete cascade
    go
    --####  测试:删除tb1中数据  ######
    delete from tb1 where id=1
    select * from tb1
    /*
    id jno
    ------------
    3 j4 
    4 j3 
    */
    select * from tb2
    /*
    id jno
    ------------
    4 j3 
    */
    --####  测试:删除tb2中数据  ######
    delete from tb2 where id=4
    select * from tb1
    /*
    id jno
    ------------
    3 j4 
    4 j3 
    */
    select * from tb2
    /*
    id jno
    ------------*/alter table tb2 drop constraint id_FK