it-swarm.com.de

Die Anweisung ALTER TABLE stand in Konflikt mit der Einschränkung FOREIGN KEY

Ich versuche, einer vorhandenen Tabelle, in der Daten in der Spalte enthalten sind, an der ich eine Änderung vornehmen möchte, einen neuen Fremdschlüssel hinzuzufügen.

In dev habe ich dies versucht, wo Daten existieren und nicht existieren. Wo keine Daten vorhanden sind, funktioniert dies einwandfrei.

ALTER TABLE [rpt].ReportLessonCompetency WITH CHECK
ADD CONSTRAINT [FK_Grade_TraineeGrade_Id]
FOREIGN KEY (Grade) REFERENCES [rpt].TraineeGrade(Id)

Wo es Daten gibt, erhalte ich den folgenden Fehler

Die Anweisung ALTER TABLE stand in Konflikt mit der FOREIGN KEY-Einschränkung "FK_Grade_TraineeGrade_Id". Der Konflikt trat in der Datenbank "T_test", Tabelle "Core.Report.TraineeGrade", Spalte 'Id' auf.

Ich wäre sehr dankbar, wenn mir jemand mitteilen könnte, was ich tun muss, um sicherzustellen, dass dies dort funktioniert, wo Daten vorhanden sind und nicht, da ich nicht steuern kann, ob in der Live-Datenbank vorhandene Daten vorhanden sind oder nicht.

Vielen Dank

Simon

3
Simon Price

Sie erhalten den Fehler wahrscheinlich, weil Sie verwaiste Datensätze in der Tabelle [rpt]. [ReportLessonCompetency] haben. Ein verwaister Datensatz ist ein Datensatz in einer untergeordneten Tabelle ohne einen entsprechenden übergeordneten Datensatz in der übergeordneten Tabelle. In Ihrem Fall enthält [rpt]. [ReportLessonCompetency] Werte für [Grade], die in der Tabelle [rpt] .TraineeGrade (Id) nicht vorhanden sind.

Es gibt 2 Optionen, um den Fremdschlüssel zu erstellen (obwohl es nur 1 gültige Option imo gibt).

Bereinigen Sie Ihre Daten
Zuerst können Sie die Datensätze in der untergeordneten Tabelle nachschlagen, die keinen entsprechenden übergeordneten Datensatz haben. Als Nächstes sollten Sie entweder diese Datensätze in der untergeordneten Tabelle löschen/aktualisieren oder die fehlenden übergeordneten Datensätze zu Ihrer übergeordneten Tabelle hinzufügen. Anschließend können Sie die Fremdschlüsseleinschränkung erstellen. Dies ist bei weitem die beste Option, da Ihre referenzielle Integrität garantiert ist und Ihrem Fremdschlüssel vertraut wird.
Sie können verwaiste Datensätze finden, indem Sie die folgende Abfrage ausführen:

SELECT *
FROM [rpt].ReportLessonCompetency rlc
WHERE NOT EXISTS
(
    SELECT 1 
    FROM [rpt].TraineeGrade tg
    WHERE tg.Id = rlc.Grade
)

MIT NOCHECK
Die andere Option Wäre, den Fremdschlüssel mit WITH NOCKECK Zu erstellen. SQL Server erstellt den Fremdschlüssel, ohne die vorhandenen Daten in der Tabelle zu überprüfen. Wenn Sie Daten in die untergeordnete Tabelle aktualisieren/einfügen, werden diese Datensätze weiterhin überprüft. Folglich wird Ihr Fremdschlüssel als nicht vertrauenswürdig markiert und das Abfrageoptimierungsprogramm berücksichtigt Ihre Einschränkung zum Generieren eines Ausführungsplans nicht.
Hier Hier finden Sie ein Beispiel dafür, wie die Leistung beeinflusst werden kann.

8
Thomas Costers

Mit WITH NOCHECK können Sie vermeiden, die Einschränkungen von FOREIGN KEY anhand vorhandener Daten zu überprüfen.

ALTER TABLE [rpt].ReportLessonCompetency WITH NOCHECK
ADD CONSTRAINT [FK_Grade_TraineeGrade_Id]
FOREIGN KEY (Grade) REFERENCES [rpt].TraineeGrade(Id)

Ich würde dies nicht empfehlen, da ignorierte Verstöße gegen Einschränkungen dazu führen können, dass ein Update zu einem späteren Zeitpunkt fehlschlägt. Sie sollten stattdessen Ihre Daten bereinigen.

0
Tahir Riaz