我正在尝试实现级联更新,我在网上搜索了Fk约束。我发现了解决方案 http://sqlandme.com/2011/08/08/sql-server-how-to-cascade-updates-and-deletes-to-related-tables/
该博客解释这个过程非常好。我不确定这个剂量只适用于PK,或者我们也可以在非pk字段上设置级联更新/删除。
我有两张桌子。
tblregistration :
等
tblposting_detail :
现在,当用户编辑他/她的个人资料并更新公司名称时,即更新compname
中的tblregistration
,我想要的是compname
更新我{已更新其个人资料的同一用户{1}}。
我读过一些文章说级联更新和删除有时会产生意想不到的结果,因此它不是一直不首选,而是更好地在级联更新中使用两个不同的更新SQL语句。
任何人都可以帮助我理解这个特定问题的过程和最佳实践。
感谢。
答案 0 :(得分:2)
级联更新和级联删除可提供完美的可预测结果。只有当开发人员不知道可预测的结果时,他们才会给出意想不到的结果。
外键约束的目标必须是一组唯一的列 - 列集必须具有主键约束或唯一约束。
在您的情况下,tblregistration.CompName不是唯一的。 (可能不能是唯一的。)你可能使用触发器模仿级联,或者通过撤消对表的权限并要求应用程序代码使用存储过程,但你'最好从tblPosting_detail中删除列CompName。当您需要该列中的数据时,请使用带有连接的SELECT查询。
答案 1 :(得分:0)
你可以通过引入一个“超级密钥”来实现它,该“超级密钥”涵盖了您现有的PK以及您希望级联的其他列:
create table tblregistration (
UserID int not null primary key,
UserName int not null,
CompName int not null,
constraint UQ_reg_target UNIQUE (UserID,CompName)
)
go
create table tblposting_detail (
Bidid int not null primary key,
UserID int not null references tblregistration (UserID),
CompName int not null,
constraint FK_post_reg FOREIGN KEY (UserID,CompName)
references tblregistration (UserID,CompName) on update cascade
)
go
insert into tblregistration values (1,1,1)
go
insert into tblposting_detail values (2,1,1)
go
update tblregistration set CompName = 4 where UserID = 1
go
select * from tblposting_detail
结果:
Bidid UserID CompName
----------- ----------- -----------
2 1 4
但我同意其他人的意见,你可能不应该在第二张表中列出这一栏目。我还建议不要在所有表格上使用tbl
前缀。
(请注意,此时,由{J} UserID
以及UserID
和CompName
上的FK保持FK仅取决于您,或者仅保留后者一个)