Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Die ALTER TABLE-Anweisung stand in Konflikt mit der FOREIGN KEY-Einschränkung in SQL Server – SQL Server / TSQL-Tutorial Teil 69

Szenario:

Sie haben zwei Tabellen dbo.Customer und dbo.Orders ohne Primär-Fremdschlüssel-Beziehung erstellt. Nachdem Sie Tabellen erstellt haben, haben Sie einige Datensätze eingefügt. Später wurde Ihnen klar, dass Sie Foreign Key Constraint hinzufügen sollten. Als Sie versucht haben, die dbo.Orders-Tabelle zu ändern, haben Sie eine Fehlermeldung erhalten.

Erstellen Sie dbo.Customer- und Dbo.Order-Tabellen mit dem folgenden Skript

USE YourDatabaseNameGOCREATE TABLE dbo .Customer ( Customerid INT PRIMARY KEY ,FName VARCHAR(100) ,LName VARCHAR(100) ,SSN VARCHAR(10) )CREATE TABLE dbo.Orders (OrderId INT Identity(1, 1) ,OrderitemName VARCHAR(50) ,OrderItemAmt INT, Kunden-ID int )
 Fügen Sie Beispieldatensätze mit dem folgenden Skript ein.

 INSERT INTO dbo.Customer (CustomerId,FName, LName,SSN) VALUES (1,'Aamir','Shahzad','000-000- 00') INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,Customerid) values ​​('TV',2,2)
 Jetzt fügen wir eine Fremdschlüsseleinschränkung hinzu

 Ändern Sie die Tabelle dbo.Orders Fügen Sie eine Einschränkung hinzu Fk_CustomerId Fremdschlüssel(CustomerId) Referenzen dbo.Customer(CustomerId)
 
 
 Wenn wir das obige Skript ausführen, erhalten wir den folgenden Fehler.

Msg 547, Level 16, State 0, Line 31
Die ALTER TABLE-Anweisung stand im Konflikt mit der FOREIGN KEY-Einschränkung "Fk_CustomerId". Der Konflikt ist in der Datenbank "YourDatabaseName", Tabelle "dbo.Customer", Spalte "Customerid" aufgetreten.

Da dbo.Customer den Wert 1 für die CustomerId-Spalte hat und in der dbo.Orders-Tabellenspalte CustomerId den Wert 2 hat Die Werte stimmen nicht überein. Aus diesem Grund haben wir den obigen Fehler erhalten.

Lösungen:

1) Korrigieren Sie die Daten in der zweiten Tabelle (dbo.Orders) Wir können die Daten in der zweiten Tabelle reparieren und die CustomerId-Spaltenwerte aktualisieren. Sobald wir korrekte Daten haben, die mit unserer Primärtabelle (Dbo.Customer.CustomerId) übereinstimmen, können wir problemlos eine Fremdschlüsselbeschränkung erstellen.
2) Verwenden Sie Alter Table mit Nocheck (Vorhandene Daten ignorieren ) Wenn Sie sich nicht um die Beziehung vorhandener Daten kümmern. Sie können With NoCheck mit der alter table-Anweisung verwenden, und es wird die Prüfung zum Validieren von Daten und zum Erstellen einer Fremdschlüsseleinschränkung ignorieren. Sobald die Foreign Key Constraint erstellt wurde, erzwingt sie die Integrität für alle neu eingefügten Datensätze.
 Ändere die Tabelle dbo.Orders with Nocheck Add Constraint Fk_CustomerId Foreign Key(CustomerId) References dbo.Customer(CustomerId) 
 
 
 
 
Videodemo