无限级分类 如何正确删除类别?
表结构
页面图
这个怎么删除好点?删除父类时 子类需要都删除掉 --------------------编程问答-------------------- 做主外键约束的时候指定级联删除就好了,删除后重新绑定数据源。 --------------------编程问答-------------------- easy --------------------编程问答-------------------- 没看见你的图
表结构 父类id 还有一个字段是包括所有的父类id及自己的id(jihe) 如1,5,9 1是5的父类 5是9的父类
删除时根据jihe删除 假如删除5 id like(包含5的就删) --------------------编程问答-------------------- /upload/20131227/AA.jpg
表结构
/upload/20131227/BB.jpg
页面图
弄错刚才 --------------------编程问答--------------------
表结构
页面图
弄错刚才 --------------------编程问答-------------------- 在主表中写一个delete的触发器,这样在删除主表信息时会自动删除子表的的相关数据
--------------------编程问答--------------------
create trigger [dbo].[Del] on [主表]
for delete
as
declare @id int
select @id=actid from deleted
delete from 子表 where 关联id =@id
--------------------编程问答-------------------- 你的关联是在一张表中
--级联删除
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,'化妆品')
insert into cat_tb values(300,'家具')
go
create table sub_tb
(
sub_id int primary key,
sub_name varchar(20),
cat_id int foreign key(cat_id) references cat_tb(cat_id) ON DELETE CASCADE ON UPDATE CASCADE
)
go
DROP TABLE sub_tb,cat_tb
create trigger [dbo].[Del] on [table]--------------------编程问答-------------------- 这个在后台程序中应该怎样操作呢? --------------------编程问答--------------------
for delete
as
declare @id int
select @id=id from deleted
delete from table where classprantid =@id
这个不用在程序中操作,你在删除数据时数据库会自动删除,你不用做任何操作 --------------------编程问答-------------------- lz 针对你的表 添加一个字段 classJIHE 记录所有父类的id与自己的id
查询删除 --------------------编程问答-------------------- 数据库最后有个字段
记录了以上父级的 --------------------编程问答-------------------- 编写一个触发器是明智的选择,这样省事又省心,同时也不用担心是否会操作错误 --------------------编程问答--------------------
--生成测试数据--------------------编程问答-------------------- 如果数据库用ACCESS 触发器就不能用啦 --------------------编程问答-------------------- 递归查找数据库中这个父节点的所有子节点。一个个干掉。。
create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
insert into tb values('001' , null , '广东省')
insert into tb values('002' , '001' , '广州市')
insert into tb values('003' , '001' , '深圳市')
insert into tb values('004' , '002' , '天河区')
insert into tb values('005' , '003' , '罗湖区')
insert into tb values('006' , '003' , '福田区')
insert into tb values('007' , '003' , '宝安区')
insert into tb values('008' , '007' , '西乡镇')
insert into tb values('009' , '007' , '龙华镇')
insert into tb values('010' , '007' , '松岗镇')
go
--创建用户定义函数
create function f_cid(@id varchar(10)) returns varchar(8000)
as
begin
declare @i int , @ret varchar(8000)
declare @t table(id varchar(10) , pid varchar(10) , level int)
set @i = 1
insert into @t select id , pid , @i from tb where id = @id
while @@rowcount <> 0
begin
set @i = @i + 1
insert into @t select a.id , a.pid , @i from tb a , @t b where a.pid = b.id and b.level = @i - 1
end
select @ret = isnull(@ret , '') + id + ',' from @t
return left(@ret , len(@ret) - 1)
end
go
--执行查询
select id , children = isnull(dbo.f_cid(id) , '') from tb group by id
drop table tb
drop function f_cid
/*
id children
---- ---------------------------------------
001 001,002,003,004,005,006,007,008,009,010
002 002,004
003 003,005,006,007,008,009,010
004 004
005 005
006 006
007 007,008,009,010
008 008
009 009
010 010
(所影响的行数为 10 行)
create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
insert into tb values('001' , null , N'广东省')
insert into tb values('002' , '001' , N'广州市')
insert into tb values('003' , '001' , N'深圳市')
insert into tb values('004' , '002' , N'天河区')
insert into tb values('005' , '003' , N'罗湖区')
insert into tb values('006' , '003' , N'福田区')
insert into tb values('007' , '003' , N'宝安区')
insert into tb values('008' , '007' , N'西乡镇')
insert into tb values('009' , '007' , N'龙华镇')
insert into tb values('010' , '007' , N'松岗镇')
go
;with t as
(
select id , cid = id from tb
union all
select t.id , cid = tb.id
from t join tb on tb.pid = t.cid
)
select id , cid = STUFF((SELECT ',' + rtrim(cid) FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , '')
from tb
group by id
order by id
/*
id cid
---- ---------------------------------------
001 001,002,003,005,006,007,008,009,010,004
002 002,004
003 003,005,006,007,008,009,010
004 004
005 005
006 006
007 007,008,009,010
008 008
009 009
010 010
(10 行受影响)
*/
;with t as
(
select id , name , cid = id , path = cast(name as nvarchar(100)) from tb
union all
select t.id , t.name , cid = tb.id , path = cast(tb.name as nvarchar(100))
from t join tb on tb.pid = t.cid
)
select id , name ,
cid = STUFF((SELECT ',' + rtrim(cid) FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , ''),
path = STUFF((SELECT ',' + path FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , '')
from tb
group by id , name
order by id
/*
id name cid path
---- ---------- ------------------------------------------- ---------------------------------------------------------------------
001 广东省 001,002,003,005,006,007,008,009,010,004 广东省,广州市,深圳市,罗湖区,福田区,宝安区,西乡镇,龙华镇,松岗镇,天河区
002 广州市 002,004 广州市,天河区
003 深圳市 003,005,006,007,008,009,010 深圳市,罗湖区,福田区,宝安区,西乡镇,龙华镇,松岗镇
004 天河区 004 天河区
005 罗湖区 005 罗湖区
006 福田区 006 福田区
007 宝安区 007,008,009,010 宝安区,西乡镇,龙华镇,松岗镇
008 西乡镇 008 西乡镇
009 龙华镇 009 龙华镇
010 松岗镇 010 松岗镇
(10 行受影响)
*/
drop table tb
补充:.NET技术 , ASP.NET