繁体   English   中英

在SQL中的两个表之间创建外键

[英]Creating a Foreign Key between two tables in 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冲程杯等)

骑士需要一个外键,因为Riders.ClassID列引用了Class.ClassID-骑士中的Classid列将具有重复的值(多个骑手都在同一类中),但是您希望强制执行的关系是“没有骑手应输入一个未知的类别”,即“任何骑手记录都不应具有不存在于类别表的classid列中的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM