如何将值插入到附加了外键的空表中?

时间:2014-06-20 19:33:51

标签: sql sql-server

我刚创建了几个表,其中很多表都是用外键引用的。我刚刚创建了它们,所以它们在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'.

1 个答案:

答案 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不是外键,那为什么会出现?您始终可以通过连接查询获取其值。问题CandidateIDTrainingSession表中的外键的原因吗?

<强>更新

您遇到的问题是:

&#34; TrainingSesssionId表中需要TrainingSession值才能在Candidate表中插入一行。由于你没有,它会给你一个外键约束错误。同样,您需要CandidateId表中的Candidate值才能在TrainingSession表中插入一行。这样也会给你一个外键约束错误。没有逃避这一点。因此,这种设计是有缺陷的。

你能做的是:

TrainingsessionId表中移除CandidateCandidateId表中删除TrainingSession列。关键是你需要删除其中一个外键引用。哪一个?这取决于您的特定情况和用例。但这里的要点是你必须删除其中一个外键引用。无论如何它是多余的。 您只需要一个外键即可在两个表之间创建关系。由于存在(注释:单个)外键,您可以在两个表之间关联,并根据外键从任一表中获取值。根本不需要另外一个外键。

其次,由于Qualifications没有外键引用,在这种情况下它似乎就像一个主表。所以,插入从这里开始。然后,您必须在Candidate表中插入(如果TrainingSessionId不是此表中的外键),然后在TrainingSession表中。

希望这有帮助!!!