两个SQL Server表之间的多个FOREIGN KEY

时间:2019-03-03 19:40:23

标签: sql sql-server foreign-keys

我正在为我的作业创建第一个数据库,但是我遇到了问题。我有一个Tasks表,其中有一个列,其中包含正在处理此任务的员工和更改了任务状态的员工。因此,我需要有2个外键(EmployeeIdChangedId)都引用Id表的Employee列。

这是描述我想要的图:

Database diagram. Take a look at the "Tasks" and "Employee" tables.

数据库的构建没有问题,但是我无法将项目插入Tasks表中。

这是此表的代码:

CREATE TABLE [dbo].[Employees]
(
    [Id] INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    [FirstName] VARCHAR(50) NOT NULL, 
    [SecondName] VARCHAR(50) NOT NULL, 
    [LastName] VARCHAR(50) NOT NULL 
)

CREATE TABLE [dbo].[Tasks]
(
    [Id] INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    [Deadline] DATE NOT NULL, 
    [StatusId] INT NOT NULL,
    [ChangedId] INT NOT NULL,
    [StatusDate] DATE NOT NULL,
    [EmployeeId] INT NOT NULL,
    [ShortInfo] VARCHAR(255) NOT NULL,
    [ProjectId] INT NOT NULL, 
    FOREIGN KEY (EmployeeId) REFERENCES Employees(id),
    FOREIGN KEY (ChangedId) REFERENCES Employees(id),
    FOREIGN KEY (ProjectId) REFERENCES Projects(id),
    FOREIGN KEY (StatusId) REFERENCES Status(id)
)

将项目添加到Tasks

INSERT INTO Tasks(Deadline, StatusID, ChangedId, StatusDate, EmployeeId, ShortInfo, ProjectId)
VALUES ('2019-12-01', 1, 4, '2018-11-29', 2, 'Hack the security system.', 3),
       ('2019-02-17', 4, 1, '2019-01-19', 3, 'Design new class system.', 1),
       ('2019-06-01', 3, 2, '2019-01-11', 4, 'Test the last storyline mission.', 2),
       ('2018-12-05', 2, 2, '2018-10-03', 2, 'Create Zeus statue model.', 2),
       ('2019-05-21', 1, 1, '2019-04-14', 3, 'Test the Horde campaign.', 1);

错误信息:

  

INSERT语句与FOREIGN KEY约束“ FK__Tasks__StatusId__6B24EA82”发生冲突。在数据库“ Task4”的表“ dbo.Status”的列“ Id”中发生了冲突。

2 个答案:

答案 0 :(得分:0)

将值插入tasks应该很容易:

insert into tasks (deadline, statusid, changeid, statusdate, employeeid, shortinfo, projectid)
    values (@deadlinedate, @statusid, @changeid, @statusdate, @employeeid, 'This is short info', @projectid);

您只需要确保以下几点:

  • 没有一个值是NULL并且它们的类型正确。
  • 所有“ id”列均引用相应表中的现有行。例如,@statusid有一个整数值,并且该值在status.id中。

答案 1 :(得分:0)

尝试为employeeid和changedid命名外键,因为它们引用了Employee表的相同ID列。