SQL Server:引用表中没有与外键'FK'中的引用列列表匹配的主键或候选键

时间:2015-05-09 10:40:12

标签: sql sql-server foreign-keys primary-key ddl

我一直试图解决这个错误几分钟,但我不知道我在表定义中缺少什么。

表格的代码如下:

public static main(String[] args) { B observer = new B(); Visualisation v = new Visualisation(observer); }

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]) );

Curse

当我尝试执行第二个脚本时,我得到以下错误(我知道是与表之间的关系有关的东西),我不知道问题可能在哪里。我是C#和SQL Server的新手,所以如果我问了一个愚蠢的问题,请原谅。

  

Msg 1776,Level 16,State 0,Line 1
  引用的表'Autocare'中没有主键或候选键与外键'FK_Curse_Autocare'中的引用列列表匹配。

     

Msg 1750,Level 16,State 0,Line 1
  无法创建约束。查看以前的错误。

1 个答案:

答案 0 :(得分:1)

外键必须引用唯一键,无论是否为主键。在您当前提供的DDL中,Autocare中的唯一标识符(主键)是IDAutocarIDTipAutocar的组合。另一方面,您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])
)

或者,您可以从IDTipAutocar的主键定义中删除Autocare

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])
);

从您的业务逻辑角度来看,这更有意义。