当前位置:编程学习 > C#/ASP.NET >>

无限级分类 如何正确删除类别?


表结构

页面图

这个怎么删除好点?删除父类时 子类需要都删除掉 --------------------编程问答-------------------- 做主外键约束的时候指定级联删除就好了,删除后重新绑定数据源。 --------------------编程问答-------------------- 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
--------------------编程问答-------------------- 这个在后台程序中应该怎样操作呢? --------------------编程问答--------------------
引用 9 楼 zongwenlong 的回复:
这个在后台程序中应该怎样操作呢?

这个不用在程序中操作,你在删除数据时数据库会自动删除,你不用做任何操作 --------------------编程问答-------------------- lz 针对你的表 添加一个字段 classJIHE 记录所有父类的id与自己的id  
查询删除 --------------------编程问答-------------------- 数据库最后有个字段

记录了以上父级的 --------------------编程问答-------------------- 编写一个触发器是明智的选择,这样省事又省心,同时也不用担心是否会操作错误 --------------------编程问答--------------------
--生成测试数据 
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
--------------------编程问答-------------------- 如果数据库用ACCESS 触发器就不能用啦 --------------------编程问答-------------------- 递归查找数据库中这个父节点的所有子节点。一个个干掉。。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,