我有两个表,一对一的关系我在项目表的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
)
答案 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