双列主键

时间:2015-11-19 13:33:32

标签: sql-server database foreign-keys foreign-key-relationship

我有以下三个样本表(用于提问的简化演示):

CREATE TABLE Teams 
(
    Id int IDENTITY(1,1) NOT NULL,
    Name varchar(50) NOT NULL,
    PRIMARY KEY (Id)
)

CREATE TABLE TeamGroups 
(
    Id int NOT NULL,
    TeamId int NOT NULL,
    PRIMARY KEY (Id,TeamId)
)

CREATE TABLE RoomBookings
(
    Id int NOT NULL,
    TeamGroupId int NOT NULL,
    RoomId int NOT NULL,
    PRIMARY KEY (Id)
)

我已经设置了以下外键:

ALTER TABLE TeamGroups WITH CHECK
ADD CONSTRAINT [FK_TeamGroups_Teams] 
    FOREIGN KEY (TeamId) REFERENCES Teams(Id)

我们的想法是每个Team可以为零或更多TeamGroups,每个TeamGroup可以有零个或多个RoomBookings

为了反映这一点,我想将RoomBookings表中的外键添加到TeamGroups表中。

我尝试使用Management Studio中的Relationships GUI创建外键(主键表:TeamGroups.ID,外键表:RoomBookings.TeamGroupId)但是我收到错误:

  

表格中的列' TeamGroups'与现有主键不匹配   或UNIQUE约束

我假设它是因为TeamGroups表有两列主键?

我真的不想从TeamGroups表中创建外键约束(例如,密钥存在于TeamGroups表中),因为该表最终将由其他表格(例如EquipmentBookingsGroupManagers等)。

任何帮助?

1 个答案:

答案 0 :(得分:0)

如果您的主键由多个列组成,那么<​​strong>所有外包键也必须所有这些列 - 没有办法解决这个问题。

但我不明白为什么在尝试根据TeamGroups列将TeamTeam.Id关联起来时会出现此错误....很好。

尝试使用:

ALTER TABLE TeamGroups WITH CHECK 
   ADD CONSTRAINT [FK_TeamGroups_Teams] 
   FOREIGN KEY (TeamId) REFERENCES Teams(Id);

您有Teams(根本不是TeamGroups中的有效列),而您REFERENCES Teams.id错误了 - 它必须是REFERNCES Teams(Id);(列在括号中 - 而不是&#34;点&#34;符号)

更新TeamGroupsRoomBookings - 是....要么使用TeamGroups表中RoomBookings的两列 - 或者什么会阻止你将TeamGroups.Id列设为INT IDENTITY然后将PK放在这一列?有什么好理由吗?

CREATE TABLE TeamGroups 
(
    TeamGroupId int NOT NULL,
    TeamId int NOT NULL,

    PRIMARY KEY (TeamGroupId)
)

ALTER TABLE dbo.RoomBookings
   ADD CONSTRAINT FK_RoomBookings_TeamGroup
   FOREIGN KEY TeamGroupId REFERENCES TeamGroups(TeamGroupId)