Creazione di una chiave esterna composta in SQL Server 2008

Ho due tabelle che mi piacerebbe creare una chiave esterna per.

Tabella Primaria

PK - Key1 - varchar(20)
PK - Key2 - date

Tabella Secondaria

PK - AutoID
FK - Key1 - varchar(20)
FK - Key2 - date

Quando cerco di creare la relazione tra primario e secondario tabella, continuo a ricevere il messaggio di

Le colonne della Tabella Primaria non corrispondono a una primary key o unique
vincolo.

Ci possono essere molti record nella tabella secondaria con la stessa Key1 e Key2 così abbiamo realizzato la chiave primaria di un’auto creata numero.

Qualche idea su come posso impostare la chiave esterna relazione tra le due tabelle?

  • Key1 e Key2 nella tabella primaria non è una chiave primaria composta (o di un unico vincolo)
  • Key1 e Key2 Primaria Tabella sono impostato come chiave primaria composta.
  • Esattamente come stai cercando di impostare il vincolo?
InformationsquelleAutor Danielle | 2011-07-11

 

5 Replies
  1. 13

    Alcuni dei quali sono concentrati, alcuni di questo è il contesto per gli altri avere alcun tipo di problema come questo (come tutti in realtà prima ricerca?)

    La prima cosa da controllare quando si ha un problema di creazione di una chiave è fare in modo che non mismatch i tipi di dati in due tabelle. Se si dispone di un bigint in uno e un int in un altro colpo. Questo è vero a tutti i tasti, ma più probabilmente raccolto in più campi. Semplice matematica mostra il motivo per cui la probabilità aumenta.

    Prossimo numero di dati. Se non è possibile creare la chiave a causa di dati, è necessario scoprire ciò che esiste nella tabella figlio che non esiste nella tabella padre. LEFT JOIN le tabelle (secondaria del secondo/a sinistra del join) e comprendono solo le righe della tabella primaria è null. Sarà necessario creare questi record nella tabella padre o sbarazzarsi di loro.

    Un modo per “aggirare” questo è impostare una nuova chiave primaria della tabella padre. Si crea quindi una chiave esterna su questa nuova chiave primaria e partita come numero di record della tabella figlio. Potrete quindi partecipare set up e si può fare la pulizia come attività secondaria.

    Quale è meglio? Nuova chiave primaria o di lavoro con il composito chiave? Questo in realtà dipende dalla natura dei dati, ma io sono più appassionato di utilizzare una chiave derivata più di una naturale chiave o una chiave composta. Ma, ci sono momenti in cui il lavoro necessario per ottenere un singolo campo chiave derivata è un sacco di lavoro.

    • Grazie! Questa descrizione aiutato a risolvere il problema.
    • Ho cercato e trovato questa risposta, quindi sì, facciamo un po di ricerca prima. 😉
  2. 47

    Una chiave esterna DEVE fare riferimento a colonne che compongono un indice univoco (PK o UK) con lo stesso numero di colonne, la loro tipologia e ordine. E. g.:

    CREATE TABLE PrimaryTable (
      Key1 varchar(20),
      Key2 date)
    GO
    
    ALTER TABLE PrimaryTable ADD CONSTRAINT PK
      PRIMARY KEY (Key1, Key2)
    GO
    
    CREATE TABLE SecondaryTable (
      AutoID int IDENTITY,
      Key1 varchar(20),
      Key2 date)
    GO
    
    ALTER TABLE SecondaryTable ADD CONSTRAINT FK
      FOREIGN KEY (Key1, Key2) REFERENCES PrimaryTable (Key1, Key2)
    GO
    • Sono stato morso da quella di oggi: avere il riferimento di chiavi in un ordine diverso da quello che sono stati dichiarati sul tavolo.
    • Stesso problema qui, come TheKaptain. Nelle colonne di riferimento devono essere nello stesso ordine in cui essi chiave è stata creata nel. Per ottenere il corretto ordine, fare clic destro sulla chiave esterna (sotto la cartella chiavi quando si espande la tabella in sql server management studio) e lo script crea per appunti. Incollare. Assicurati che il tuo riferimento colonne sono nello stesso ordine della chiave.
  3. 11

    Questo lavoro:

    CREATE TABLE PTable (
         Key1 varchar(20) not null,
         Key2 date not null,
         constraint PK_PTable PRIMARY KEY (Key1,Key2)
    )
    
    CREATE TABLE STable (
         AutoID int IDENTITY(1,1) not null primary key,
         Key1 varchar(20) not null,
         Key2 date not null,
         constraint FK_STable_PTable FOREIGN KEY (Key1,Key2) references PTable (Key1,Key2)
    )

    Quello che dovete fare è ottenere il Management Studio per script tabelle e confrontarle con quelle di sopra.

  4. 7

    Ci sono alcune buone risposte qui, ma vorrei prendere questo un ulteriore passo avanti, per il bene dei posteri.

    Una chiave esterna che non hanno a riferimento un Primary key (Unico, Indice Cluster) o un Unique vincolata colonna in un’altra tabella. Fondamentalmente, il componente necessario è il Unique vincolo. Vorrei aggiungere che si può avere nullable colonne del foreign key, MA se si consente valori null in “composito” chiave SQL salta la verifica dei dati nella relazione di chiave esterna. Questo è un punto importante da ricordare come il motivo principale che la maggior parte di noi le chiavi esterne è quello di garantire l’integrità dei dati in nostro database.

    Su una nota finale, come esplicitamente dichiarare a tutti il mio nome di un tasto. Perché, si potrebbe chiedere? Se è necessario utilizzare “l’Indicizzazione Full-Text”, in futuro, per le funzionalità di ricerca, non fare così, ti costringe a fare riferimento a tutte le “auto-generato” i nomi delle chiavi. Questo potrebbe non essere un grosso problema per i piccoli progetti che non richiedono la trasformazione dei dati o pianificati indice Full-Text aggiornamenti, ma se si sta eseguendo lo script di questa funzionalità si potrebbe rendere il vostro lavoro più difficile, come ad esempio dover cercare il nome effettivo della Chiave Primaria nome predefinito: pk_someTable_1248594832828495904).

    Ecco cosa vorrei fare in scrittura SQL per evitare in futuro eventuali insidie:

    1. Non consente valori Null in Composito chiavi esterne, se possibile.
    2. Nome di tasti in modo esplicito utilizzando un concordato convenzione di denominazione (ad esempio,PK_Schema/56_TalbeName_Col1_Col2). Non solo questo darà un nome standard per la chiave, ma si può facilmente vedere dall’indice che le colonne sono di riferimento, e in quale ordine.

    Codice:

    CREATE TABLE MySchema.PrimaryTable ( 
      Key1 varchar(20) NOT NULL, 
      Key2 date NOT NULL,
      CONSTRAINT PK_MySchema_PrimaryTable_Key1_Key2 PRIMARY KEY (Key1, Key2)
    )
    GO 
    
    CREATE TABLE MySchema.SecondaryTable ( 
      AutoID int IDENTITY, 
      Key1 varchar(20) NOT NULL, 
      Key2 date NOT NULL,
      CONSTRAINT FK_MySchema_SecondaryTable_Key1_Key2
         FOREIGN KEY (Key1, Key2) REFERENCES PrimaryTable (Key1, Key2)
    )
    GO 

    OptillectTeam è praticamente morto con la sua risposta. Volevo solo chiarire un paio di cose importanti che non erano state citate prima. C’è un buon riferimento sulla MSDN vista a discutere di questo e di più su chiavi esterne: Vincolo Di Chiave Esterna.

Lascia un commento