事务或者触发器级联删除

mynameiszhouzehao 2011-03-21 01:55:02
这里我有两张表,一张是cat_tb表(大类别表),另一张是小类别表(subCat_tb)

我想修改\删除\大类别表cat_tb的时候,小类别表也随着改变

create table cat_tb(
cat_id int primary key,
cat_name varchar(20)
)
select * from cat_tb
insert into cat_tb(cat_id,cat_name) values(2001,'电子产品')
insert into cat_tb values(2000,'美容产品')


create table subCat_tb(
subCat_id int primary key,
subCat_name varchar(20),
cat_id int foreign key(cat_id) references cat_tb
)

select * from subCat_tb
insert into subCat_tb(subCat_id,subCat_name,cat_id) values(200,'电脑',2001)
insert into subCat_tb(subCat_id,subCat_name,cat_id) values(201,'美容护理水',2000)
...全文
108 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mynameiszhouzehao 2011-03-22
  • 打赏
  • 举报
回复
有外键的情况下,怎么实现级联删除呢?(触发器)
mynameiszhouzehao 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 andy_liucj 的回复:]

引用 2 楼 orchidcat 的回复:

参考
http://msdn.microsoft.com/zh-cn/library/ms186973.aspx
可以看看2楼给的
[/Quote]

刚刚看了,也研究了一天了,最后还是有些疑惑?
我知道怎么去解决这个问题
一种用级联方式实现
一种用触发器去实现.不过用触发器的时候,好像设置一个外键的时候就不知道怎么是实现,没有外键我可以实现这个功能.

希望各位帮我解决下这个问题,当类别表出现外键的时候,要怎么去实现.多谢
andy_liucj 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 orchidcat 的回复:]

参考
http://msdn.microsoft.com/zh-cn/library/ms186973.aspx
[/Quote]可以看看2楼给的
mynameiszhouzehao 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 orchidcat 的回复:]

参考
http://msdn.microsoft.com/zh-cn/library/ms186973.aspx
[/Quote]

麻烦你看看一下的代码多谢
create table cat_tb
(
cat_id int primary key,
cat_name varchar(20)
)
go
insert into cat_tb values(100,'电脑')
insert into cat_tb values(200,'美容')
go

create table sub_tb
(
sub_id int primary key,
sub_name varchar(20) ,
cat_id int foreign key(cat_id) references cat_tb
)
go
insert into sub_tb values(1000,'台式机',100)
insert into sub_tb values(1001,'键盘',100)
insert into sub_tb values(1002,'视频',100)
insert into sub_tb values(1003,'洗发水',200)
insert into sub_tb values(1004,'沐浴露',200)
go

drop trigger cat_sub
create trigger cat_sub
on cat_tb
after delete ,update
as
if exists(select 1 from inserted ) and exists(select 1 from deleted)
begin
update sub_tb set cat_id=(select cat_id from inserted) where cat_id=(select cat_id from deleted)
print '修改成功'
end
else if exists(select 1 from deleted)
begin
delete sub_tb from deleted where sub_tb.cat_id=(select deleted.cat_id from deleted)
print '删除成功'
end


修改\删除失败:
服务器: 消息 547,级别 16,状态 1,行 1
DELETE 语句与 COLUMN REFERENCE 约束 'FK__sub_tb__cat_id__310335E5' 冲突。该冲突发生于数据库 'master',表 'sub_tb', column 'cat_id'。
语句已终止。


这个需要原因是设置了外键,如果没设置外键的话是可以删除,修改的.
请问下,怎么用触发器才能实现级联删除呢?
mynameiszhouzehao 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sql77 的回复:]

引用 5 楼 mynameiszhouzehao 的回复:
用cascade那是级联删除.兄弟姐们,我现在需要用是触发器或者事务来实现那个功能.多谢指点

如果同时更改多笔,显然有问题,用CASCADE级联可以
[/Quote]

难道不能有一个外键的吗? 如果没有外键能否修改\删除呢?
SQL77 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mynameiszhouzehao 的回复:]
用cascade那是级联删除.兄弟姐们,我现在需要用是触发器或者事务来实现那个功能.多谢指点
[/Quote]
如果同时更改多笔,显然有问题,用CASCADE级联可以
mynameiszhouzehao 2011-03-21
  • 打赏
  • 举报
回复
用cascade那是级联删除.兄弟姐们,我现在需要用是触发器或者事务来实现那个功能.多谢指点
mynameiszhouzehao 2011-03-21
  • 打赏
  • 举报
回复
你应该先删除小表再删除大表?
如果我的小类别很多,那样子不怎么合理吧?

应该一次性的删除大类别小类就可以删除了.

例如我现在又级联删除就可以实现,那么触发器或者事务怎么去实现呢
快溜 2011-03-21
  • 打赏
  • 举报
回复
你应该先删除小表再删除大表
Mr_Nice 2011-03-21
  • 打赏
  • 举报
回复
Mr_Nice 2011-03-21
  • 打赏
  • 举报
回复
CASCADE

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧