我刚创建了几个表,其中很多表都是用外键引用的。我刚刚创建了它们,所以它们在sql server 2012中都是空的。
CREATE TABLE Candidate
(
candidateId int primary key,
qualificationId int NOT NULL,
trainingSessionId int NOT NULL,
prerequesiteId int NOT NULL,
courseId int NOT NULL,
qualification nvarchar(20),
jobHistoryId int NOT NULL,
name nvarchar(20)
)
INSERT INTO Candidate
values (1, 1, 1, 1, 1, 'plumer', 1, 'jordan')
我想做类似的事情,但我收到了这个错误
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Candidate__quali__29572725". The conflict occurred in database "TEC", table "dbo.Qualifications", column 'qualificationId'.
我的资格表是
CREATE TABLE Qualifications
(
qualificationId int primary key,
name nvarchar(20)
)
我还有其他表格,如
CREATE TABLE TrainingSession
(
trainingSessionId int primary key,
candidateId int foreign key references Candidate(candidateId),
courseId int NOT NULL,
prerequesiteId int NOT NULL,
qualificationId int NOT NULL,
trainingName nvarchar(20)
)
和我说的很多,他们互相引用。
那么当我收到错误时如何在这些表中插入值?
编辑:在我创建了所有表之后,我修改了它们以添加那些尚未存在的外键,如
ALTER TABLE Candidate
ADD FOREIGN KEY (qualificationId)
REFERENCES Qualifications(qualificationId)
ALTER TABLE Candidate
ADD FOREIGN KEY (trainingSessionId)
REFERENCES TrainingSession(trainingSessionId)
编辑2:我尝试插入候选人,我得到上面的错误,我尝试插入训练课程,我得到同样的错误,但在候选人
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__TrainingS__candi__173876EA". The conflict occurred in database "TEC", table "dbo.Candidate", column 'candidateId'.
答案 0 :(得分:0)
我不了解您的数据库设计。看看这个:
CREATE TABLE Candidate
(
candidateId int primary key,
qualificationId int NOT NULL,
trainingSessionId int NOT NULL, /* Does this reference TrainingSession?*/
prerequesiteId int NOT NULL,
courseId int NOT NULL,
qualification nvarchar(20),
jobHistoryId int NOT NULL,
name nvarchar(20)
)
CREATE TABLE TrainingSession
(
trainingSessionId int primary key,
candidateId int foreign key references Candidate(candidateId),
courseId int NOT NULL,
prerequesiteId int NOT NULL,
qualificationId int NOT NULL,
trainingName nvarchar(20)
)
他们似乎都在互相引用,这对我来说似乎很奇怪而且不对。理想情况下,它们之间应该只有一个参考。
另外,如果TrainingSessionId
表中的Candidate
不是外键,那为什么会出现?您始终可以通过连接查询获取其值。问题CandidateID
是TrainingSession
表中的外键的原因吗?
<强>更新强>:
您遇到的问题是:
&#34; TrainingSesssionId
表中需要TrainingSession
值才能在Candidate
表中插入一行。由于你没有,它会给你一个外键约束错误。同样,您需要CandidateId
表中的Candidate
值才能在TrainingSession
表中插入一行。这样也会给你一个外键约束错误。没有逃避这一点。因此,这种设计是有缺陷的。
你能做的是:
从TrainingsessionId
表中移除Candidate
列或从CandidateId
表中删除TrainingSession
列。关键是你需要删除其中一个外键引用。哪一个?这取决于您的特定情况和用例。但这里的要点是你必须删除其中一个外键引用。无论如何它是多余的。 您只需要一个外键即可在两个表之间创建关系。由于存在(注释:单个)外键,您可以在两个表之间关联,并根据外键从任一表中获取值。根本不需要另外一个外键。
其次,由于Qualifications
没有外键引用,在这种情况下它似乎就像一个主表。所以,插入从这里开始。然后,您必须在Candidate
表中插入(如果TrainingSessionId
不是此表中的外键),然后在TrainingSession
表中。
希望这有帮助!!!