Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql server 2008中非主键的级联更新_Sql_Sql Server_Sql Server 2008_Foreign Key Relationship - Fatal编程技术网

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

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

我正在尝试实现级联更新,并已在线搜索Fk约束。我发现解决方案如下

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

我有两张桌子

待登记注册

  • 用户标识(PK)
  • 用户名
  • 公司名称

tblposting_详细信息

  • 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的第一种解决方案。我很想投赞成票,但没有足够的代表。