我碰到一个奇怪的问题,现在有两个表。一个主表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我想,应该是删除主表的某条记录,其从表的相应删除。
比如,删除主表部门一,其下属员工全部删除。
如果反过来,删除某个员工,反而把整个部门删除了,那其他的员工不知是哪个部门了
从表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我想,应该是删除主表的某条记录,其从表的相应删除。
比如,删除主表部门一,其下属员工全部删除。
如果反过来,删除某个员工,反而把整个部门删除了,那其他的员工不知是哪个部门了
楼主可能把概念理解错了!由于从表记录参照主表,删除主表记录,从表没了参照,当然会出错啦!可以设置级联删除,解决上面的问题!--> 代码:
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 规范一栏处,将更新规则和删除规则设置为层叠,点击确定完成,即可实现级联更新
不知道你是怎么使用的!参考一下我的...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