sql server 2008中非主键的级联更新
我正在尝试实现级联更新,并已在线搜索Fk约束。我发现解决方案如下 这个博客很好地解释了这个过程。我不确定这是否只适用于PK,或者我们也可以在非PK字段上设置级联更新/删除 我有两张桌子 待登记注册:sql server 2008中非主键的级联更新,sql,sql-server,sql-server-2008,foreign-key-relationship,Sql,Sql Server,Sql Server 2008,Foreign Key Relationship,我正在尝试实现级联更新,并已在线搜索Fk约束。我发现解决方案如下 这个博客很好地解释了这个过程。我不确定这是否只适用于PK,或者我们也可以在非PK字段上设置级联更新/删除 我有两张桌子 待登记注册: 用户标识(PK) 用户名 公司名称 等 tblposting_详细信息: Bidid(pk) 用户ID(带有TBL注册的Fk) 公司名称 现在,当用户编辑其个人资料并更新公司名称时,即在tblregistration中更新compname,我想要的是在更新其个人资料的同一用户的compna
- 用户标识(PK)
- 用户名
- 公司名称
- Bidid(pk)
- 用户ID(带有TBL注册的Fk)
- 公司名称
tblregistration
中更新compname
,我想要的是在更新其个人资料的同一用户的compname
中也更新我的tblposting\u detail
我读过一些文章,说级联更新和删除有时会产生意外的结果,所以并不总是首选,最好在级联更新中使用两个不同的update SQL语句
有谁能帮我了解这个问题的流程和最佳实践吗
谢谢。层叠更新和层叠删除可以提供完全可预测的结果。只有当开发人员不知道其可预测的结果时,它们才会给出意外的结果 外键约束的目标必须是一组唯一的列——这组列必须具有主键约束或唯一约束 在您的情况下,tblregistration.CompName不是唯一的。(可能不是唯一的。)您可以使用触发器模拟级联,或者取消表上的权限,并要求应用程序代码使用存储过程,但最好从tblPosting_detail中删除列CompName。当您需要该列中的数据时,使用带有联接的SELECT查询。您可以通过引入一个“超级键”来实现,该“超级键”涵盖您现有的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
前缀
(请注意,在这一点上,由您决定是否只保留
UserID
上的FK以及UserID
和CompName
上的FK,还是保留后者)为什么要将CompName
存储在tblposting_detail
表中?CASCADE
只能应用于外键-如果看到CompName
列不是FK,则无法执行此操作。另外:为什么compname
存储在两个位置,并且需要更新两次?这是一个糟糕的设计-没有规范化-compname应该只存储一次,所以如果你更新它-就完成了。太棒了。我认为我犯了一些基本的错误,认为有一种方法可以解决我的设计中的这个问题,我将更新设计并规范化表,以便应用级联更新。为了明确起见,我已经在tbl_发布表的UserID(FK)上设置了FK约束,它映射到tbl注册表的Userd(PK),对吗?谢谢Damien。我将坚持使用从tblposting表中删除compname的第一种解决方案。我很想投赞成票,但没有足够的代表。