sql server 如何同时更新两张有关系的表

来源:百度知道 编辑:UC知道 时间:2024/05/30 14:27:25
sqlserver数据库中有两张表user和plan,u_loginname为user的主键。plan的p_loginname与user的u_loginname建立了外键联系,问题是当我对user表update时,sqlserver提示我违反了外键约束,不能更新。去除sqlserver中外键关系的insert和update强制约束后,user表可以更新但是plan表中的相关p_loginname并没有得到同时更新,想请问懂的的朋友,怎么样才能使他们一块更新?
我用的是sqlserver2005,谢谢!!

可以使用事务,但是只有当两张表都被更新了才会执行成功,否则事务回滚.
例如:
begin tran --开始执行事务
update bb set moneys=moneys-@momeys where ID=@fromID -执行的第一个操作,转账出钱,减去转出的金额
update bb set moneys=moneys+@momeys where ID=@toID --执行第二个操作,接受转账的金额,增加
if @@error<>0 --判断如果两条语句有任何一条出现错误
begin rollback tran –开始执行事务的回滚,恢复的转账开始之前状态
return 0
end
go

外键约束只是对表中取值的一种约束,要么为空,要么为主表中主键的取值.而你主表中更新子表是不会同步更新的!
所以你要创建一个触发器,让两张表同步更新!如何来做这个工作,正在学习中...
如果你只要更新,在外键约束里面选择级联更新,也就是INSERT和UPDATE规范中的更新规则.不过在2005里面好像不叫级联更新了,那是SQL Server2000中的说话,好像叫层叠,具体你看一下!

之所以建立外键就是为了说明plan的数据以user数据为依据,你要修改user而不动plan当然不行了;
sql server的语法我不太清楚,不过可以给你两种方法:
1、去掉外键约束,update user之后紧接着update plan,不过这种方法明显不是你想要的;
2、分别建立user和plan的中间表,把修改后的数据先放到这两张数据表中,然后删除user和plan中的对应记录,最后把中间表的数据移过来并清除中间表

你user表上创建一个更新触发器S_Update.
create trigger S_Update
on user
for update
as
declare @sNum=u_loginname
from update
update from plan
where u_loginname=@sNum