你是要用修改后的libai_id来更新libai_book表的libai_classid字段吧?当然条件是修改前的libai_id和libai_book的libai_classid字段相同。 你写的触发器逻辑有问题,仔细看看就知道了。 如下写法,应该可以: create trigger update4 on libai_class for update as begin declare @old_libai_id 类型(长度), @new_libai_id 类型(长度) if not update(libai_id) return select @old_libai_id=libai_id from deleted select @new_libai_id=libai_id from insertedupdate libai_book set libai_classid=@new_libai_id where libai_classid=@old_libai_idif @@error <>0 begin rollback raiserror 99999 '更新失败' return endend
没有错啊,我用的是update libai_class set libai_id=2 where id=102libai_id变为2,但是libai_book.libai_classid跟原来相同的都没有什么变化??????
答: 举个例子,比如表a的字段1和表b的字段2是相关联的,也就是说当表a的字段1修改时,表b的字段2也要相应修改。 现在,表a.字段1:abc->bbc 你希望表b的字段2中有abc的也要相应改成bbc。不是吗? 但是数据库在按照你写的语句进行操作的时候,是执行以下语句: update 表b set 字段2=bbc where 字段2=bbc 而不是: update 表b set 字段2=bbc where 字段2=abc
你写的触发器逻辑有问题,仔细看看就知道了。
如下写法,应该可以:
create trigger update4 on libai_class
for update
as
begin
declare @old_libai_id 类型(长度),
@new_libai_id 类型(长度)
if not update(libai_id) return
select @old_libai_id=libai_id from deleted
select @new_libai_id=libai_id from insertedupdate libai_book set libai_classid=@new_libai_id
where libai_classid=@old_libai_idif @@error <>0
begin
rollback
raiserror 99999 '更新失败'
return
endend
当修改表a的字段1时,触发修改表b的字段2,条件是表a的字段1和表b的字段2相同。
既然条件是它们两个相等的时候修改,那么还有修改的必要吗?已经相等了,就不必要再改了。所以,实际上它已经修改了,所以体现不出来。
当然这和你的本意相背了。因为它是拿你修改后的class_id的值来进行比较,修改的。如果出错的时候,最好不要图省事,最好写的条理清晰一点。代码多一点不是坏事。
人的工作简单了,意味着计算机的工作复杂了。
set a.libai_classid=b.libai_id
from libai_book a join libai_class b
on a.libai_classid=b.libai_id lovvver(春晖) 说的很对!!
你有两张表,一张是产品的类别,一张是产品的所属,
你的trigger的目的是当修改产品的类别的时候,产品所属要随着修改是不是.
SELECT *
FROM deleted
你要进行这类修改也要这么用
举个例子,比如表a的字段1和表b的字段2是相关联的,也就是说当表a的字段1修改时,表b的字段2也要相应修改。
现在,表a.字段1:abc->bbc
你希望表b的字段2中有abc的也要相应改成bbc。不是吗?
但是数据库在按照你写的语句进行操作的时候,是执行以下语句:
update 表b set 字段2=bbc
where 字段2=bbc
而不是:
update 表b set 字段2=bbc
where 字段2=abc