sql - SQL 表阻止我添加外键
问题描述
我在 VS 中创建了一个 SQL 表,用于存储每个客户端的房间,所以该表具有RoomId (int)
和UserID (int)
.
因为我只想将存在的房间和客户端添加到表中,它们都是具有 2 个表的外键的键,一个存储RoomID
和名称,另一个存储Client ID
和名称。
Room
和UserId
表格:
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 存在有办法通过这个障碍吗?
解决方案
外键的列必须与它们通过编号、类型和顺序引用的列相匹配。
userinfotable
您在的上有一个主键(username, userid)
。但是在usersinroomstable
你试图让外键(userid)
引用它。列数不匹配,无法添加外键。
据推测,username
不应该真的是主键的一部分,userinfotable
并且是偶然到达那里的。将其从主键约束中删除。
或者,如果username
必须在主键中,则将这样的列添加到表中usersinroomstable
并将其添加到外键约束中。
推荐阅读
- javascript - 是否可以在 react native 上获取有关已安装应用程序的用户信息?
- python - TypeError:'bool' 对象不可迭代
- c# - System.Threading.ThreadAbortException:线程被中止。
- c# - 将 MediaTranscoder.PrepareStreamTranscodeAsync() 与内存流一起使用?
- sql - SQL 选择查询以从 2 个表中检索数据 - 显示 0 而不是表 1 或表 2
- python - 从 R 到 python pandas:在重复项上按顺序创建 id 键系列
- relational-algebra - 如何从 RelaX 中的两列中减去值(在线关系代数计算器)
- javascript - 我可以在 Express POST 请求中进行 DOM 操作吗?
- python - Discord.py - AttributeError:模块'discord'没有属性'Embed'
- django - 如何使用主管和 gunicorn 或 daphne 运行应用程序 django 频道