首页 > 解决方案 > SQL 表阻止我添加外键

问题描述

我在 VS 中创建了一个 SQL 表,用于存储每个客户端的房间,所以该表具有RoomId (int)UserID (int).

因为我只想将存在的房间和客户端添加到表中,它们都是具有 2 个表的外键的键,一个存储RoomID和名称,另一个存储Client ID和名称。

RoomUserId表格:

CREATE TABLE [dbo].[UsersInRoomsTable]
(
    RoomId INT NOT NULL,
    UserId INT NOT NULL,
    CONSTRAINT PK_RS PRIMARY KEY(RoomId, UserId), 
    CONSTRAINT [fk_room] FOREIGN KEY([RoomId]) REFERENCES [dbo].[RoomsTable]([RoomId]),
    CONSTRAINT [fk_user] FOREIGN KEY ([UserId]) REFERENCES [dbo].[UserInfoTable] ([UserId])
);

存储所有用户的表:

CREATE TABLE [dbo].[UserInfoTable] 
(
    [UserName] NVARCHAR (50) NOT NULL,
    [UserId]   INT           NOT NULL,
    CONSTRAINT [PK_roomuser] PRIMARY KEY CLUSTERED ([UserName] ASC, [UserId] ASC)
);

存放所有房间的表

CREATE TABLE [dbo].[RoomsTable] 
(
    [RoomId]   INT           NOT NULL,
    [RoomName] NVARCHAR (50) NOT NULL,
    PRIMARY KEY CLUSTERED ([RoomId] ASC)
);

Rooms除了和用户表中的最后一行之外,一切正常:

    CONSTRAINT [fk_user] FOREIGN KEY ([UserId]) REFERENCES [dbo].[UserInfoTable] ([UserId])

当我尝试更新表时,我收到错误 SQL71516:

SQL71516:引用的表 '[dbo].[UserInfoTable]' 不包含与外键中的引用列列表匹配的主键或候选键。如果引用的列是计算列,它应该被持久化

我该如何解决这个问题,是什么原因造成的?

编辑:我想我知道什么是代码冲突:由于某种原因,我不能有一个外键连接到包含 2 个索引的键 IE:fk_user 是一个 Fk 到具有 2 个键(用户 ID 和用户名)的表 UserInfoTable 存在有办法通过这个障碍吗?

标签: sql

解决方案


外键的列必须与它们通过编号、类型和顺序引用的列相匹配。

userinfotable您在的上有一个主键(username, userid)。但是在usersinroomstable你试图让外键(userid)引用它。列数不匹配,无法添加外键。

据推测,username不应该真的是主键的一部分,userinfotable并且是偶然到达那里的。将其从主键约束中删除。

或者,如果username必须在主键中,则将这样的列添加到表中usersinroomstable并将其添加到外键约束中。


推荐阅读