sql - 在 SQL 中的两个表之间创建外键
问题描述
我正在尝试使用外键将两个表连接在一起。我收到错误
被引用表中没有与引用列列表匹配的主键
我不确定我错过了什么。
if exists(select * from sysobjects where name = 'Riders')
drop table Riders
go
create table Riders
(
RiderID int not null identity (10,1)
constraint pk_Riders_RiderID primary key(RiderID,ClassID),
[Name] nvarchar(50) not null,
constraint chk_Riders_Name check (len(Name) > 4),
ClassID nchar(6) not null
)
go
if exists( select * from sysobjects where name = 'Class')
drop table Class
go
create table Class
(
ClassDescription nvarchar(50) not null,
ClassID nchar(6) not null
constraint fk_Riders_Class foreign key
references Riders(ClassID) on delete no action
)
go
解决方案
你似乎把你们的关系搞错了
类将具有 ClassID 的主键;类中不能有具有重复主键的行。班级(作为表格)因此将您的班级代码解码为班级名称(SNR=高级运动系列 1、50CC=50 CC 2 Stroke Cup 等)
Riders 需要一个外键,因为 Riders.ClassID 列引用 Class.ClassID - Riders 中的 Classid 列将具有重复值(多个骑手都在同一个类中)但您希望强制执行的关系是“没有骑手应输入一个未知的类别”即“任何骑手记录都不应具有类别表的类别列中不存在的类别值”
因此,您正在寻找更像:
if exists( select * from sysobjects where name = 'Class')
drop table Class
go
create table Class
(
ClassDescription nvarchar(50) not null,
ClassID nchar(6) not null constraint pk_Class_ClassID primary key(ClassID)
)
go
create table Riders
(
RiderID int not null identity (10,1)
constraint pk_Riders_RiderID primary key(RiderID),
[Name] nvarchar(50) not null,
constraint chk_Riders_Name check (len(Name) > 4),
ClassID nchar(6) not null
constraint fk_Riders_Class foreign key
references Class(ClassID) on delete no action
)
go
推荐阅读
- node.js - 我想在 mongodb 和 nodejs 中获取过去 7 天内火花最多的所有用户
- excel - excel中的双重依赖下拉列表
- pandas - 数据框分配在嵌套 for 循环中不起作用
- python - 没有指示 K 聚类的每个预测估计值与哪一行相关
- python - openpyxl - 访问命名范围的问题?
- javascript - npm 错误!错误号-4058
- c# - Cloud Firestore GetSnapshotAsync 以返回一个值。统一和 C#
- android-studio - 如何测试从 DialogFragment 到另一个 DialogFragment 的导航?
- javascript - 缩小表格以适应列?
- snowflake-cloud-data-platform - Snowflake - 从变体列中的 JSON 数据动态推断模式