sql server 2008中非主键的级联更新

时间:2013-12-03 15:30:15

标签: sql sql-server sql-server-2008 foreign-key-relationship

我正在尝试实现级联更新,我在网上搜索了Fk约束。我发现了解决方案 http://sqlandme.com/2011/08/08/sql-server-how-to-cascade-updates-and-deletes-to-related-tables/

该博客解释这个过程非常好。我不确定这个剂量只适用于PK,或者我们也可以在非pk字段上设置级联更新/删除。

我有两张桌子。

tblregistration

  • UserID(PK)
  • 用户名
  • COMPNAME

tblposting_detail

  • Bidid(pk)
  • UserID(Fk with tblregistration)
  • COMPNAME

现在,当用户编辑他/她的个人资料并更新公司名称时,即更新compname中的tblregistration,我想要的是compname更新我{已更新其个人资料的同一用户{1}}。

我读过一些文章说级联更新和删除有时会产生意想不到的结果,因此它不是一直不首选,而是更好地在级联更新中使用两个不同的更新SQL语句。

任何人都可以帮助我理解这个特定问题的过程和最佳实践。

感谢。

2 个答案:

答案 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以及UserIDCompName上的FK保持FK仅取决于您,或者仅保留后者一个)