SQL 服务器:引用的 table 中没有与外键 'FK' 中的引用列列表相匹配的主键或候选键
SQL Server : there are no primary or candidate keys in the referenced table that match the referencing column list in the foreign key 'FK'
几分钟以来我一直在尝试解决此错误,但我不知道 table 定义中遗漏了什么。
table 的代码如下:
Table Autocare
:
CREATE TABLE [dbo].[Autocare]
(
[IDAutocar] NUMERIC (18, 0) NOT NULL,
[IDTipAutocar] NUMERIC (18, 0) NOT NULL,
PRIMARY KEY CLUSTERED ([IDAutocar] ASC, [IDTipAutocar] ASC),
CONSTRAINT [FK_Autogari_TipAutocar]
FOREIGN KEY ([IDTipAutocar])
REFERENCES [dbo].[TipAutocar] ([IDTipAutocar])
);
Table Curse
:
CREATE TABLE [dbo].[Curse]
(
[IDCursa] NUMERIC (18, 0) NOT NULL PRIMARY KEY,
[IDTraseu] NUMERIC (18, 0) NOT NULL,
[Data] TIMESTAMP NOT NULL,
[IDCompanie] NUMERIC (18, 0) NOT NULL,
[NrLocuri] NUMERIC (18, 0) NOT NULL,
[IDAutocar] NUMERIC (18, 0) NOT NULL,
CONSTRAINT [FK_Curse_Trasee]
FOREIGN KEY ([IDTraseu])
REFERENCES [Trasee]([IDTraseu]),
CONSTRAINT [FK_Curse_Companii]
FOREIGN KEY ([IDCompanie])
REFERENCES [Companii]([IDCompanie]),
CONSTRAINT [FK_Curse_Autocare]
FOREIGN KEY ([IDAutocar])
REFERENCES [Autocare]([IDAutocar])
)
当我尝试执行第二个脚本时出现以下错误(我知道这与 table 之间的关系有关)并且我不知道问题出在哪里。我是 C# 和 SQL 服务器的新手,所以如果我问了一个愚蠢的问题,请原谅。
Msg 1776, Level 16, State 0, Line 1
There are no primary or candidate keys in the referenced table 'Autocare' that match the referencing column list in the foreign key 'FK_Curse_Autocare'.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.
你的tableAutocare
有一个复合主键由两列组成:
PRIMARY KEY CLUSTERED ([IDAutocar] ASC, [IDTipAutocar] ASC),
因此,任何希望引用 Autocare
的 table 还必须 在其外文中提供 两列 钥匙!
所以这显然不会工作:
CONSTRAINT [FK_Curse_Autocare]
FOREIGN KEY ([IDAutocar])
REFERENCES [Autocare]([IDAutocar])
因为它只引用了Autocare
的主键两列中的一个。
您需要将第二列 IDTipAutocar
添加到您的 Curse
table 并将其包含在您的外键中:
CONSTRAINT [FK_Curse_Autocare]
FOREIGN KEY ([IDAutocar], [IDTipAutocar])
REFERENCES [Autocare]([IDAutocar], [IDTipAutocar])
您的外键必须始终引用整个主键——而不仅仅是它的一部分。
外键必须引用唯一键,无论是否是主键。在您当前提供的 DDL 中,Autocare
中的唯一标识符(主键)是 IDAutocar
和 IDTipAutocar
的组合。另一方面,您有 Curse
引用 Autocare.IDAutocar
,这不是唯一的。
您可以将 IDTipAutocar
添加到 Curse
(及其外键定义):
CREATE TABLE [dbo].[Curse] (
[IDCursa] NUMERIC (18, 0) NOT NULL PRIMARY KEY,
[IDTraseu] NUMERIC (18, 0) NOT NULL,
[Data] TIMESTAMP NOT NULL,
[IDCompanie] NUMERIC (18, 0) NOT NULL,
[NrLocuri] NUMERIC (18, 0) NOT NULL,
[IDAutocar] NUMERIC (18, 0) NOT NULL,
[IDTipAutocar] NUMERIC (18, 0) NOT NULL,
CONSTRAINT [FK_Curse_Trasee]
FOREIGN KEY ([IDTraseu])
REFERENCES [Trasee]([IDTraseu]),
CONSTRAINT [FK_Curse_Companii]
FOREIGN KEY ([IDCompanie])
REFERENCES [Companii]([IDCompanie]),
CONSTRAINT [FK_Curse_Autocare]
FOREIGN KEY ([IDAutocar], [IDTipAutocar])
REFERENCES [Autocare]([IDAutocar], [IDTipAutocar])
)
或者,您可以从 Autocare
的主键定义中删除 IDTipAutocar
:
CREATE TABLE [dbo].[Autocare]
(
[IDAutocar] NUMERIC (18, 0) NOT NULL,
[IDTipAutocar] NUMERIC (18, 0) NOT NULL,
PRIMARY KEY CLUSTERED ([IDAutocar] ASC),
CONSTRAINT [FK_Autogari_TipAutocar]
FOREIGN KEY ([IDTipAutocar])
REFERENCES [dbo].[TipAutocar] ([IDTipAutocar])
);
从业务逻辑的角度来看,哪个更有意义。
几分钟以来我一直在尝试解决此错误,但我不知道 table 定义中遗漏了什么。
table 的代码如下:
Table Autocare
:
CREATE TABLE [dbo].[Autocare]
(
[IDAutocar] NUMERIC (18, 0) NOT NULL,
[IDTipAutocar] NUMERIC (18, 0) NOT NULL,
PRIMARY KEY CLUSTERED ([IDAutocar] ASC, [IDTipAutocar] ASC),
CONSTRAINT [FK_Autogari_TipAutocar]
FOREIGN KEY ([IDTipAutocar])
REFERENCES [dbo].[TipAutocar] ([IDTipAutocar])
);
Table Curse
:
CREATE TABLE [dbo].[Curse]
(
[IDCursa] NUMERIC (18, 0) NOT NULL PRIMARY KEY,
[IDTraseu] NUMERIC (18, 0) NOT NULL,
[Data] TIMESTAMP NOT NULL,
[IDCompanie] NUMERIC (18, 0) NOT NULL,
[NrLocuri] NUMERIC (18, 0) NOT NULL,
[IDAutocar] NUMERIC (18, 0) NOT NULL,
CONSTRAINT [FK_Curse_Trasee]
FOREIGN KEY ([IDTraseu])
REFERENCES [Trasee]([IDTraseu]),
CONSTRAINT [FK_Curse_Companii]
FOREIGN KEY ([IDCompanie])
REFERENCES [Companii]([IDCompanie]),
CONSTRAINT [FK_Curse_Autocare]
FOREIGN KEY ([IDAutocar])
REFERENCES [Autocare]([IDAutocar])
)
当我尝试执行第二个脚本时出现以下错误(我知道这与 table 之间的关系有关)并且我不知道问题出在哪里。我是 C# 和 SQL 服务器的新手,所以如果我问了一个愚蠢的问题,请原谅。
Msg 1776, Level 16, State 0, Line 1
There are no primary or candidate keys in the referenced table 'Autocare' that match the referencing column list in the foreign key 'FK_Curse_Autocare'.Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.
你的tableAutocare
有一个复合主键由两列组成:
PRIMARY KEY CLUSTERED ([IDAutocar] ASC, [IDTipAutocar] ASC),
因此,任何希望引用 Autocare
的 table 还必须 在其外文中提供 两列 钥匙!
所以这显然不会工作:
CONSTRAINT [FK_Curse_Autocare]
FOREIGN KEY ([IDAutocar])
REFERENCES [Autocare]([IDAutocar])
因为它只引用了Autocare
的主键两列中的一个。
您需要将第二列 IDTipAutocar
添加到您的 Curse
table 并将其包含在您的外键中:
CONSTRAINT [FK_Curse_Autocare]
FOREIGN KEY ([IDAutocar], [IDTipAutocar])
REFERENCES [Autocare]([IDAutocar], [IDTipAutocar])
您的外键必须始终引用整个主键——而不仅仅是它的一部分。
外键必须引用唯一键,无论是否是主键。在您当前提供的 DDL 中,Autocare
中的唯一标识符(主键)是 IDAutocar
和 IDTipAutocar
的组合。另一方面,您有 Curse
引用 Autocare.IDAutocar
,这不是唯一的。
您可以将 IDTipAutocar
添加到 Curse
(及其外键定义):
CREATE TABLE [dbo].[Curse] (
[IDCursa] NUMERIC (18, 0) NOT NULL PRIMARY KEY,
[IDTraseu] NUMERIC (18, 0) NOT NULL,
[Data] TIMESTAMP NOT NULL,
[IDCompanie] NUMERIC (18, 0) NOT NULL,
[NrLocuri] NUMERIC (18, 0) NOT NULL,
[IDAutocar] NUMERIC (18, 0) NOT NULL,
[IDTipAutocar] NUMERIC (18, 0) NOT NULL,
CONSTRAINT [FK_Curse_Trasee]
FOREIGN KEY ([IDTraseu])
REFERENCES [Trasee]([IDTraseu]),
CONSTRAINT [FK_Curse_Companii]
FOREIGN KEY ([IDCompanie])
REFERENCES [Companii]([IDCompanie]),
CONSTRAINT [FK_Curse_Autocare]
FOREIGN KEY ([IDAutocar], [IDTipAutocar])
REFERENCES [Autocare]([IDAutocar], [IDTipAutocar])
)
或者,您可以从 Autocare
的主键定义中删除 IDTipAutocar
:
CREATE TABLE [dbo].[Autocare]
(
[IDAutocar] NUMERIC (18, 0) NOT NULL,
[IDTipAutocar] NUMERIC (18, 0) NOT NULL,
PRIMARY KEY CLUSTERED ([IDAutocar] ASC),
CONSTRAINT [FK_Autogari_TipAutocar]
FOREIGN KEY ([IDTipAutocar])
REFERENCES [dbo].[TipAutocar] ([IDTipAutocar])
);
从业务逻辑的角度来看,哪个更有意义。