【问题标题】:UPDATE statement conflicted with FOREIGN KEY constraint - How to fix? [closed]UPDATE 语句与 FOREIGN KEY 约束冲突 - 如何修复? [关闭]
【发布时间】:2017-09-13 06:03:58
【问题描述】:

我在调试与我拥有的 SQL Server 存储过程有关的代码时遇到了一个问题

“UPDATE 语句与 FOREIGN KEY 约束 \"FK_PATIENTS_DropdownCounty\" 冲突。冲突发生在数据库 \"****\",表 \"dbo.DropdownCounty\",列 'County'

我正在使用 DropdownCounty 表填充下拉菜单,但是当我尝试更新网页时,它给了我上面的问题。我已经在 SQL 本身中尝试了 CASCADE 选项。

我使用的SQL Server存储过程如下

ALTER PROC [dbo].[PatientDetailsUpdate]
    @PatientNumber INT,           
    @HospitalNumber NVARCHAR(50),  
    @HC_Number NCHAR(20),    
    @ID_Number_LegacyID NCHAR(20),    
    @ConsentToDatabase BIT,      
    @ConsentGivenDate DATETIME,   
    @Sex CHAR(6),     
    @Forename NVARCHAR(50),
    @Surname NVARCHAR(50),
    @MaidenName NCHAR(10),     
    @DateOfBirth DATETIME,      
    @Age NCHAR(10),    
    @AddressLine1 NVARCHAR(50), 
    @AddressLine2 NVARCHAR(50), 
    @AddressLine3_TownCity NVARCHAR(50), 
    @AddressLine4_Region NVARCHAR(50),  
    @County NCHAR(17),     
    @Country NCHAR(10),   
    @PostCode NVARCHAR(50), 
    @HomeTelNumber NVARCHAR(50),  
    @MobileTelNumber NVARCHAR(50),  
    @WorkTelNumber NVARCHAR(50),  
    @Email NVARCHAR(50),  
    @Notes NVARCHAR(MAX)
AS
BEGIN
   UPDATE PATIENTS
   SET HospitalNumber = ISNULL (@HospitalNumber, HospitalNumber), 
       HC_Number = ISNULL (@HC_Number, HC_Number), 
       ID_Number_LegacyID = ISNULL (@ID_Number_LegacyID, ID_Number_LegacyID),   
       ConsentToDatabase = ISNULL (@ConsentToDatabase, ConsentToDatabase),     
       ConsentGivenDate = ISNULL (@ConsentGivenDate, ConsentGivenDate), 
       Sex = ISNULL (@Sex, Sex), 
       Forename = ISNULL (@Forename, Forename), 
       Surname = ISNULL(@Surname, Surname), 
       MaidenName = ISNULL (@MaidenName, MaidenName),   
       DateOfBirth = ISNULL (@DateOfBirth, DateOfBirth), 
       Age = ISNULL  (@Age,Age),
       AddressLine1= ISNULL(@AddressLine1, AddressLine1),
       AddressLine2= ISNULL(@AddressLine2, AddressLine2),
       AddressLine3_TownCity = ISNULL(@AddressLine3_TownCity, AddressLine3_TownCity),
       AddressLine4_Region  = ISNULL(@AddressLine4_Region, AddressLine4_Region),
       County = ISNULL(@County, County),
       Country = ISNULL(@Country, Country),
       PostCode = ISNULL(@PostCode, PostCode),
       HomeTelNumber = ISNULL(@HomeTelNumber, HomeTelNumber),
       MobileTelNumber = ISNULL(@MobileTelNumber, MobileTelNumber),
       WorkTelNumber = ISNULL(@WorkTelNumber, WorkTelNumber),
       Email = ISNULL(@Email, Email),
       Notes = ISNULL(@Notes, Notes)
   WHERE 
       PatientNumber = @PatientNumber
END

我需要使用 LEFT JOIN 来链接表格吗?

提前致谢,

对不起,我只是数据库方面的新手 我已将 DropdownCounty 的值包含在其表中

我上传的第二张图片是为了帮助您了解每当调用 BtnUpdate 时我要调用的内容

【问题讨论】:

  • 失败是因为@Country 的值在你的FK 表DropdownCounty 中不存在。那么,@Country 的值是多少,DropdownCounty 表中的当前值是多少?可能是 @Country 为空(即空字符串且 NOT null)并且您没有在语句中检查这一点。
  • 了解 UPDATE 语句失败时使用的确切值将非常有帮助。你能捕捉到吗?也许通过在运行 SQL Server Profiler 时运行它?
  • 请检查您在存储过程中为County 传递的内容。无论您传递什么,听起来它都需要存在于您的DropdownCounty.County SQL 表和列中,但它没有。
  • 县同时出现在 PATIENTS 表和 DropdownCounty 表中。这两个值都是 NCHAR,因为 County 列是 PATIENTS 表中的外键。
  • 问题是您的更新语句在County 中传递了一个在您的DropdownCounty 表中不存在的值。看看@Igor 的第一条评论,你就会明白了。当他的意思是County时,他只是打错了Country

标签: c# sql asp.net sql-server stored-procedures


【解决方案1】:

问题出在这一行:

County = ISNULL(@County, County),

您正试图将县名填充到(名称不佳的)County 列中,而实际上它应该包含CountyID

您可以通过在 SQL 中查找 CountyID 来解决此问题,如下所示:

County = CASE @County WHEN NULL THEN County ELSE (SELECT CountyID FROM DropdownCounty WHERE County = @County) END

【讨论】:

  • 嗨,John,DropdownCounty 表用于填充下拉菜单,因此我需要在 Web 应用程序中使用县的名称。当我尝试使用更新查询更新详细信息时,这是我遇到问题的时候
  • 是的。我的解决方案适应了这一点。将县名传递给存储过程,SQL 将完成剩下的工作。
  • 我还能保留 NChar 还是需要更改?
【解决方案2】:

您有一个表PATIENTS,它使用int 类型的FK CountyId 与表DropdownCounty 链接。在表PATIENTS 上的UPDATE 语句中,您尝试使用县的nchar 值而不是使用pk 值CountyId 设置FK 列CountyId,这就是您收到错误的原因。您需要使用主键的值来更新它,这就是需要持久化回PATIENTS 表的内容。

更改您的存储过程以接受 int 类型的 @CountyId而不是 nchar)并在您的 UPDATE 语句中使用它。

您的代码显示下拉菜单,几乎所有下拉控件(web、windows、wpf 等)都具有显示值和基础值(如数字标识符)的能力。这是您的代码在调用存储过程时需要传递的标识符。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2022-11-10
    • 2019-05-09
    • 2017-06-29
    相关资源
    最近更新 更多