INSERT语句与FOREIGN KEY约束冲突" FK _

时间:2017-08-07 16:39:34

标签: c# sql-server tsql sql-server-2012

我有两个表,一对一的关系我在项目表的ID中生成了projectDetails FK的DetailsID:

 projects: 
         ID,         //has FK With DetailsID in Details table & auto identity (1,1)
         ProjectName,
         Areas,
         PaymentSystem,
         ReceivedDate,
         PropertyClassification,
         ProjectImage

  ProjectDetails:
     DetailsID ,auto identity ( 1,1)
     ProjectDetailName,
     ProjectDetailImage

我正在尝试在项目表中插入新记录,在这行代码中给出了这个错误:

    con.Open();
    comm.ExecuteNonQuery(); // when execute
  

System.Data.SqlClient.SqlException:' INSERT语句与FOREIGN KEY约束冲突" FK_Projects_ProjectDetails"。冲突发生在数据库" AlamaarRealEstate",table" dbo.ProjectDetails",column' DetailsID'。

这是我存储的插入:

ALTER proc [Insert_Project]
   @Projectname                    NVARCHAR(MAX) , 
   @areas                          NVARCHAR(MAX) , 
   @Paymentsystem                  NVARCHAR(MAX) , 
   @Receiveddate                   date , 
   @Classification                 NVARCHAR(MAX) , 
   @Projectimage                   Nvarchar(MAX) 
  as

  INSERT INTO dbo.Projects
      (            
        ProjectName,
        Areas,
        PaymentSystem,
        ReceivedDate,
        PropertyClassification,
        ProjectImage                                                     
      ) 
 VALUES 
      ( 
        @Projectname ,
        @areas,
        @Paymentsystem ,
        @Receiveddate ,
        @Classification,
        @Projectimage          

      )

2 个答案:

答案 0 :(得分:4)

问题解释了答案。 Referential Integrity未正确维护,您尝试插入主值不存在的子表。请先将值插入Project_details。这将解决您的问题。如果您没有这样做会引发错误,请在插入之前检查DetailID表中是否存在Projects

答案 1 :(得分:2)

如果没有更多细节,您的问题很难回答。例如,在您的过程中,您为插入执行显式列命名,并将您遇到问题的列保留为LEAVE OUT。因此,如果proc是错误的,那将是你的示例外键约束错误的轰炸。但你甚至没有列出' ID'要插入程序的字段。因此,如果您使用的是“身份”,这种情况很常见。字段自我种子,但你声称它是一个外键。所以像其他人一样评论,如果没有更多的代码来显示你的表的确切方式,那就很难猜到了。这是一个你可以运行的自解压示例,它显示列是否可以为空,并且我有一个关键约束它可以工作。没有表的确切代码以及proc,很难说清楚。你给的是伪代码。

USE Tester  --just a test database I have, you can use whatever database you want
GO

IF OBJECT_ID('Projects') IS NOT NULL 
    DROP TABLE Projects

IF OBJECT_ID('ProjectDetails') IS NOT NULL 
    DROP TABLE ProjectDetails

create TABLE ProjectDetails
(
    DetailsID INT CONSTRAINT PK_DetailsId PRIMARY KEY,
    ProjectDetailName VARCHAR(32)
  )

CREATE TABLE Projects 
(
    Id INT CONSTRAINT FK_Projects_ProjectDetails FOREIGN KEY (Id) REFERENCES ProjectDetails(DetailsId),         
    ProjectName varchar(32)

)
GO

IF OBJECT_ID('Insert_Project') IS NOT NULL 
    DROP PROC Insert_Project
GO

Create proc Insert_Project
   @Projectname                    NVARCHAR(MAX) 
  as

  INSERT INTO dbo.Projects  ( ProjectName ) 
  VALUES (  @Projectname )
GO

Select *
From dbo.Projects

EXEC dbo.Insert_Project @Projectname = N'Test' -- nvarchar(max)

Select *
From dbo.Projects