2016-06-16 4 views
1

Ein sehr einfaches Skript macht mich verrückt. Es sagt, es kann keinen referenzierten Schlüssel finden. Keine Ahnung, worum es geht. Ich benutze SQL SERVER 2014 und dieses Skript ist für die Erstellung meiner Datenbanktabellen. Ich versuche, die id_TABLE_1 in der Tabelle TABLE_2 Verweis auf die ID der Tabelle TABLE_1 zu machen.SQL Server Tabelle Erstellungsfehler: Es gibt keine primären oder Kandidatenschlüssel in der referenzierten

CREATE TABLE TABLE_1 
(
    id int identity, 
    email varchar(50) not null, 

    constraint PK_TABLE_1 primary key (id,email) 
) 
GO 

CREATE TABLE TABLE_2 
(
    id int identity, 
    id_TABLE_1 int not null, 

    constraint PK_TABLE_2 primary key (id), 
    constraint FK_TABLE_2 foreign key (id_TABLE_1) 
     references TABLE_1(id) on delete cascade 
) 
GO 

Der Fehler ist:

Msg 1776, Ebene 16, Status 0, Zeile 32
Es ist kein primärer oder Kandidatenschlüssel in der referenzierten Tabelle 'table_1', die die Referenzierung entsprechen Spaltenliste im Fremdschlüssel 'FK_TABLE_2'.

Msg 1750, Ebene 16, Status 0, Zeile 32
kann nicht Zwang oder Index erstellen. Siehe vorherige Fehler.

Können Sie mir hier helfen?

+1

Die Fehlermeldung erklärt genau, was nicht stimmt. Es gibt keinen Index nur für die Spalte "OBJET_GEO.id". –

+1

Nein, Ihr Primärschlüssel ist ein zusammengesetzter Schlüssel mit Spalten 'id, email_utilisateur'. –

Antwort

5

Laut Kommentar versuchen Sie, auf einen Index zu verweisen, der nicht existiert. Der Primärschlüssel für Ihre Tabelle TABLE_1 ist ein zusammengesetzter Schlüssel, der zwei Spalten enthält: id und email.

Um dies zu kompilieren, können Sie entweder Ihre Primärschlüssel ändern:

CONSTRAINT PK_TABLE_1 PRIMARY KEY (id) 

oder erstellen Sie einen neuen Index für nur die id Spalte:

CREATE INDEX IX_TABLE_1_id ON TABLE_1 (id); 
+1

omg Das habe ich nicht mal gesehen. Ok, was ich tun wird ist, ID als Primärschlüssel zu behalten und UNIQUE (ID, E-Mail) als Kombination zu verwenden –

+0

Denken Sie darüber nach, was das Hinzufügen eines eindeutigen Indexes für "ID" und "E-Mail" erreichen wird. Wenn Sie eine eindeutige E-Mail-Adresse pro Zeile angeben möchten, fügen Sie in Ihrem eindeutigen Index nur "E-Mail" ein. –

-1

Es macht keinen Sinn zu Haben Sie einen zusammengesetzten Primärschlüssel, der eine Identitätsspalte enthält. Die ID-Spalte ist bereits eindeutig und nicht NULL, daher sollte sie der Primärschlüssel sein.

Wenn die E-Mail auch eindeutig sein soll, entfernen Sie sie aus dem Primärschlüssel und deklarieren Sie sie als eindeutig.

+0

Nicht mit meinem Problem verbunden. Danke für Ihren Rat. –

+0

Ich sehe oft zusammengesetzte Clustering-Schlüssel, die aus zwei Spalten bestehen, wobei die zweite eine Identität ist. Zum Beispiel wird '(OrderKey, OrderLineKey)' sicherstellen, dass alle Zeilen für die gleiche Reihenfolge zusammen sind. Und da sie normalerweise zur gleichen Zeit erstellt werden, ist die Indexfragmentierung kein Problem. (Das heißt, ich habe noch nie einen gesehen, bei dem die Identitätsspalte zuerst steht.) –

+0

@JonathanAllen Als Neuling sehe ich den Unterschied in der Reihenfolge der Felder in einer UNIQUE- oder PK-Einschränkung nicht ganz. –