程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了删除具有参照完整性的表 - 获取 REFERENCE 约束大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决删除具有参照完整性的表 - 获取 REFERENCE 约束?

开发过程中遇到删除具有参照完整性的表 - 获取 REFERENCE 约束的问题如何解决?下面主要结合日常开发的经验,给出你关于删除具有参照完整性的表 - 获取 REFERENCE 约束的解决方法建议,希望对你解决删除具有参照完整性的表 - 获取 REFERENCE 约束有所启发或帮助;

我想删除一个有博客评论和博客评论回复的用户(父表)

我将它编码为首先删除 BlogCommentReply(BlogComment 的子项),然后是 BlogComment(BlogCommentReply 的父项),然后是用户(两者的父项)。

我收到错误:

deletE 语句与 REFERENCE 约束“FK_BlogCommentReply_UserID”冲突。冲突发生在数据库“DBGbngDev”、表“dbo.blogCommentReply”、“UserID”列中。

我在 BlogCommentReply 和 BlogComment 表上有 FK 键。


1.) 我是否正确创建了表结构? 2.) 我需要级联 - 为什么? 3.) 删除码顺序是否正确? _ 我相信在
之前不能删除父表 子项首先被删除。对吗?


表创建:

create table [dbo].[User]
(
   [UserID] [int] IDENTITY(1,1) NOT NulL,-- PK
   other columns....      
   CONSTraiNT [PK_User] PRIMary KEY CLUSTERED
   (
     [UserID] ASC
   ) WITH (PAD_INDEX = OFF,STATISTICS_norECOmpuTE = OFF,IGnorE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = 
           ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMary]
          ) ON [PRIMary]
   GO

create table [dbo].[BlogComment]
(
  [BlogCommentID] [int] IDENTITY(1,-- PK      
  [UserID] [int] NOT NulL,-- FK
  other columns....   
  CONSTraiNT [PK_BlogComment] PRIMary KEY CLUSTERED
  (
    [BlogCommentID] ASC
  ) WITH (PAD_INDEX = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMary]
         ) ON [PRIMary]
  GO

  alter table [dbo].[BlogComment] WITH checK ADD CONSTraiNT [FK_BlogComment_UserID] FOREIGN 
  KEY([UserID]) REFERENCES [dbo].[User] ([UserID])
  GO

create table [dbo].[BlogCommentReply]
(
  [BlogCommentReplyID] [int] IDENTITY(1,-- FK
  [BlogCommentID] [int] NOT NulL,-- FK    
  other columns.... 
  CONSTraiNT [PK_BlogCommentReply] PRIMary KEY CLUSTERED
  (
     [BlogCommentReplyID] ASC
  ) WITH (PAD_INDEX = OFF,ALLOW_PAGE_LOCKS = ON) ON [PRIMary]
         ) ON [PRIMary]
  GO

  alter table [dbo].[BlogCommentReply] WITH checK ADD CONSTraiNT [FK_BlogCommentReply_UserID] FOREIGN 
  KEY([UserID]) REFERENCES [dbo].[User] ([UserID])
  GO

 alter table [dbo].[BlogCommentReply] WITH checK ADD CONSTraiNT [FK_BlogCommentReply_BlogCommentID] 
 FOREIGN KEY([BlogCommentID]) REFERENCES [dbo].[BlogComment] ([BlogCommentID])
 GO

执行删除操作的存储过程(简化讨论):

deletE dbo.blogCommentReply
FROM dbo.blogComment a
WHERE ( BlogCommentReply.blogCommentID = a.blogCommentID AND BlogCommentReply.UserID = @a_UserID )

deletE dbo.blogComment
WHERE UserID = @a_UserID

deletE dbo.[User]
WHERE ( UserID = @a_UserID )

解决方法

BlogCommentReply 中删除数据时,您的 FK 似乎正在执行其工作并阻止您创建孤立行。

您可以将 deletE 中的第一个 BlogCommentReply 重写为两个语句以使其正常工作:

-- Remove replies added by the deleted user
deletE
  FROM  dbo.blogCommentReply
  WHERE (UserId = @a_UserId)

-- Remove blog comment replies added by other users creaTing replies to a comment made by the deleted user
deletE
  FROM  dbo.blogCommentReply
  WHERE (BlogCommentId IN (
                          SELECT  BlogCommentId
                            FROM  BlogComment
                            WHERE (UserId = @a_UserId)
                          ))

在第一条语句中,您只是尝试从 BlogCommentReply 中删除使用 FK 到 User 表的行。

在第二个语句中,您删除对将被删除的博客评论的任何回复。

针对您的具体问题:

1.我是否正确创建了表结构?

然有多种方法可以实现,但看起来不错。

2.我需要级联吗?为什么?

没有。 Cascade 消除了糟糕设计和懒惰开发的恶臭。尝试 避免使用它们(请注意,这是一个意见,而不是事实陈述)。

this question 中有一些有趣的地方。

3.删除码顺序是否正确?

是的,按照关键优先级从表中删除。

4.我相信在先删除子表之前不能删除父表。对吗?

确实,没有级联删除是正确的,并且在您的 情况下,抛出的错误表明 数据库是健全的。

大佬总结

以上是大佬教程为你收集整理的删除具有参照完整性的表 - 获取 REFERENCE 约束全部内容,希望文章能够帮你解决删除具有参照完整性的表 - 获取 REFERENCE 约束所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:-约束获取