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先修改为新值),再执行外码约束啊~
解决方案 »
- sql2k安装时自动跳出
- 咨询一个联合查询的问题
- 请问如何在删除触发器中,根据待删除的记录条件判断是否删除还是不删除该记录?
- 请问如何在sqlserver2000与access中传递数据表,和sqlserver中不同的数据库或两个sqlserver中传递表,谢谢
- 在查询分析器的对象浏览器里,怎么更改当前数据库?
- 高手请进,如何在新的用户下建立表,急
- xp_cmdshell代理帐户问题
- 这个SQL怎么写?
- sql server 数据库的逻辑数据类型是 bit 吗?
- 一个sql的写法,超难,解决即结帖
- 联接查询的使用场合与分类
- SQL server创建带有游标的存储过程 使用表名作参数 执行找不到游标
如下修改
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
)
(
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为什么这样不对呢?可能我的理解还有很大问题,期待会者再次指教~
NOCHECK CONSTRAINT FK_Department_Department --我的里面的外码约束命名为
ALTER TABLE Department
NOCHECK CONSTRAINT FK_Department_Department --我的里面的外码约束命名为
这两句放到触发器外面,更新操作时执行。
触发器里面要发生嵌套,不知道情况怎么样还有那句if update(DeptID)就不要加了,垃圾代码