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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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 = Senior Sport Series 1,50CC = Fifty CC 2 Stroke Cup等)

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

以上是关于在SQL中的两个表之间创建外键的主要内容,如果未能解决你的问题,请参考以下文章

SQL中的外部键约束有啥用?

sql server如何添加外键

sql server的主键与外键问题

在 SQL/Vb.net 中的多个表之间填充主键/外键

sql怎么设置外键

SQL表与表之间建立外键约束之后,怎么建立连级更新和删除?