日期:2014-05-18  浏览次数:20346 次

[哈哈]送上美女一个,关于父子节点控制的问题

表名称   pmc_file

分类基本资料       上一级分类
pmc01                       pmc02                                       ----这是表字段名称                          
001                             (null)
002                             (null)
003                               001
004                               001
005                               002
006                               003


现在要求我新增一笔基本资料     上级分类不允许是自己及自己的下级分类
如   001的上一级分类就不能是001     006的上一级分类是003    
最高等级分类为NULL      

高手帮我写一下,谢谢。。。。   送上美女一个


------解决方案--------------------
这问题不错,
可以用函数+check约束来处理,也可以用函数+触发器来处理,都差不多,就只说一种了

函数+check约束:
--建立环境
create table pmc_file (
pmc01 varchar(10),
pmc02 varchar(10)
)
go

insert pmc_file select
'001 ', null
union all select
'002 ', null
union all select
'003 ', '001 '
union all select
'004 ', '001 '
union all select
'005 ', '002 '
union all select
'006 ', '003 '

go

--建立函数
create function fn_IsParent (
@pmc01 varchar(10),@pmc02 varchar(10)
)
returns int
as
begin
declare @t varchar(10)
set @t=@pmc01
while @t is not null and @t <> @pmc02
begin
set @pmc01=@t
select @t =pmc02 from pmc_file where pmc01=@pmc01
end
if @t=@pmc02
return 1
return 0
end

go

--建立约束
ALTER TABLE pmc_file WITH NOCHECK ADD
CONSTRAINT CK_12345 CHECK (dbo.fn_IsParent(pmc02,pmc01)=0)

go

--正常
update pmc_file
set pmc02= '002 '
where pmc01= '001 '
go

--冲突
update pmc_file
set pmc02= '006 '
where pmc01= '001 '
go

服务器: 消息 547,级别 16,状态 1,行 1
UPDATE 语句与 TABLE CHECK 约束 'CK_12345 ' 冲突。该冲突发生于数据库 'Test1 ',表 'pmc_file '。
语句已终止。

------解决方案--------------------
建议函数+触发器。