首页 > 解决方案 > 在 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

标签: sqlsql-serverforeign-keys

解决方案


你似乎把你们的关系搞错了

类将具有 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

推荐阅读