Create table Department
(
    DeptID        int    check((dbo.RegexMatch(DeptID,'^[1-9]\d*$')=1)),
    DeptName    varchar(20) NOT NULL,
    FatherID    int default(0) check(([dbo].[RegexMatch](FatherID,'^([1-9]\d*)$')=1)),
    SchoolName    varchar(20) NOT NULL,
    primary key    (DeptID), 
foreign key (DeptID) references Department
)其中两个check就是判定FatherID为正整数,可直接忽视
问题是,我在Department表中,FatherID引用了同一表中的DeptID,这样没法级联更新,说是会引发无限循环之类的,于是我就写了个触发器,每当更新DeptID是会把以原来以该DeptID为FatherID的记录的FatherID更新为新的DeptID(比如有两条条记录为“1,信息学院,1“、“5,计算机系,1”,当我把第一条记录的DeptID 1改为2后,两条记录自动变为“2,信息学院,2“、“5,计算机系,2”~
可是现在只要我一修改被其他记录FatherID引用的DeptID,就会提示如下
Update 语句与SAME TABLE REFERENCE 约束"FK_Department_Department"冲突,该冲突发生于dbo.Department.FatherID
我想应该是外键自身引用的问题,我把外键约束删了就不会有问题的,但在我的数据库中外键是需要的,请问有办法解决吗?我想在修改时能不能先执行我的触发器(把相应的FatherID先修改为新值),再执行外码约束啊~

解决方案 »

  1.   

    外键建错了
    如下修改
    Create table Department
    (
        DeptID        int    ,
        DeptName    varchar(20) NOT NULL,
        FatherID    int default(0) ,
        SchoolName    varchar(20) NOT NULL,
        primary key    (DeptID), 
    foreign key (FatherID) references Department 
    )
      

  2.   

    http://topic.csdn.net/u/20100612/23/92bb3194-6d85-4e63-abfd-2c4677722833.html这里10L试试。
      

  3.   

    不好意思,一时仓促,给错代码了,把修改以前的传上去了~完整的创建代码如下Create table Department
    (
    DeptID int check((dbo.RegexMatch(DeptID,'^[1-9]\d*$')=1)),
    DeptName varchar(20) NOT NULL,
    FatherID int  check(([dbo].[RegexMatch](FatherID,'^([1-9]\d*)$')=1)),
    SchoolName varchar(20) NOT NULL,
    primary key (DeptID), 
    foreign key (FatherID) references Department
    )
    看了楼上朋友的代码很受启发,思考如下:每次的更新内部操作机制应该是是先删除再插入的,所以EXISTS(SELECT 1 FROM deleted)以及from inserted 一定存在吧?我把自己的触发器修改如下:use iTao
    IF OBJECT_ID('tri_upd_dept') IS NOT NULL
    drop trigger tri_upd_dept
    go
    create trigger tri_upd_dept
    on Department after update
    as
    SET NOCOUNT ON
    if update(DeptID)
    begin
                    ALTER TABLE Department 
                    NOCHECK CONSTRAINT FK_Department_Department --我的里面的外码约束命名为 
                                                                      --FK_Department_Department 
    declare @n_id int,@o_id int 
    select @n_id=DeptID from inserted
    select @o_id=DeptID from deleted
    update Department set FatherID=@n_id
    where  FatherID=@o_id
                    ALTER TABLE Department 
                     CHECK CONSTRAINT FK_Department_Department 
      
    end
    go为什么这样不对呢?可能我的理解还有很大问题,期待会者再次指教~
      

  4.   

     ALTER TABLE Department 
                    NOCHECK CONSTRAINT FK_Department_Department --我的里面的外码约束命名为 
     ALTER TABLE Department 
                    NOCHECK CONSTRAINT FK_Department_Department --我的里面的外码约束命名为 
    这两句放到触发器外面,更新操作时执行。
    触发器里面要发生嵌套,不知道情况怎么样还有那句if update(DeptID)就不要加了,垃圾代码