这问题不错, 可以用函数+check约束来处理,也可以用函数+触发器来处理,都差不多,就只说一种了函数+check约束: --建立环境 create table pmc_file ( pmc01 varchar(10), pmc02 varchar(10) ) goinsert 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 endgo--建立约束 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'。 语句已终止。
可以用函数+check约束来处理,也可以用函数+触发器来处理,都差不多,就只说一种了函数+check约束:
--建立环境
create table pmc_file (
pmc01 varchar(10),
pmc02 varchar(10)
)
goinsert 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
endgo--建立约束
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'。
语句已终止。