2015-05-09 18 views
5

Ho cercato di risolvere questo errore per diversi minuti ma non so cosa sia Mi manca dalla definizione della tabella.SQL Server: non ci sono chiavi primarie o candidate nella tabella di riferimento che corrispondono all'elenco di colonne di riferimento nella chiave esterna "FK"

Il codice per le tabelle sono al di sotto:

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

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

Quando provo ad eseguire il secondo script ottengo il seguente errore (e so che è qualcosa legato alla relazione tra i tavoli) e non capisco dove possa essere il problema. Sono un novizio in C# e SQL Server, quindi per favore perdonami se ho fatto una domanda stupida.

Msg 1776, livello 16, stato 0, riga 1
Non ci sono chiavi primarie o candidate nella tabella 'Autocare' riferimento che corrispondono l'elenco delle colonne di riferimento nella chiave esterna 'FK_Curse_Autocare'.

messaggio 1750, livello 16, stato 0, riga 1
Impossibile creare il vincolo. Vedi errori precedenti.

+2

Si dispone di PK composito nella prima tabella di due colonne e si crea FK solo su una colonna. Questo è il problema. È necessario aggiungere la colonna IdTipAutocar nella seconda tabella e creare FK su entrambe le colonne IDAutocar. –

+1

possibile duplicato di [Non ci sono chiavi primarie o candidate nella tabella di riferimento che corrispondono all'elenco delle colonne di riferimento nella chiave esterna] (http://stackoverflow.com/questions/17879735/there-are-no-primary-or- candidate-chiavi-nella-tabella-referenziata-quella-partita-il-re) – jpw

+0

Possibile duplicato di [Non ci sono Chiavi Primarie o Candidate nella tabella di riferimento] (https://stackoverflow.com/questions/12213301/ no-o-candidati-chiavi primarie--in-the-riferimento-tabella ci-sono-) –

risposta

7

La tabella Autocare ha un composto chiave primaria confezionati con due colonne:

PRIMARY KEY CLUSTERED ([IDAutocar] ASC, [IDTipAutocar] ASC), 

Pertanto, qualsiasi tabella che intenda riferimento Autocaredeve anche fornire entrambe le colonne in la loro chiave straniera!

Quindi questo sarà ovviamente non lavoro:

CONSTRAINT [FK_Curse_Autocare] 
    FOREIGN KEY ([IDAutocar]) 
    REFERENCES [Autocare]([IDAutocar]) 

in quanto fa riferimento solo uno delle due colonne della chiave primaria della Autocare.

È necessario aggiungere che seconda colonna IDTipAutocar al vostro tavolo Curse e includerlo nella vostra chiave esterna:

CONSTRAINT [FK_Curse_Autocare] 
    FOREIGN KEY ([IDAutocar], [IDTipAutocar]) 
    REFERENCES [Autocare]([IDAutocar], [IDTipAutocar]) 

vostre chiavi esterne deve sempre riferimento la chiave primaria TUTTO - non solo parti di esso.

1

Una chiave esterna deve fare riferimento a una chiave univoca, che sia primaria o meno. Nel DDL attualmente in dotazione, l'identificatore univoco (chiave primaria) in Autocare è la combinazione di IDAutocar e IDTipAutocar. D'altra parte, hai Curse riferimento a Autocare.IDAutocar, che non è univoco.

è possibile aggiungere IDTipAutocar-Curse (e la sua definizione chiave esterna):

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

In alternativa, è possibile rimuovere IDTipAutocar da Autocare s' primaria definizione chiave:

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

Che mai fa più senso dal punto di vista della logica aziendale.