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

Die UPDATE-Anweisung steht in Konflikt mit der REFERENCE-Einschränkung – SQL Server / TSQL-Tutorial Teil 76

Szenario:

Sie arbeiten als SQL Server-Entwickler. Sie haben eine Aktualisierungsanweisung für eine der Tabellen geschrieben und erhalten den folgenden Fehler.


Msg 547, Level 16, State 0, Line 32
Die UPDATE-Anweisung steht in Konflikt mit der REFERENCE-Einschränkung "FK_".
Der Konflikt ist in der Datenbank „YourDatabaseName“, Tabelle „SchemaName.YourTableName“, Spalte „ColumnName“ aufgetreten.
Die Anweisung wurde beendet.

Wie kann dieses Problem gelöst werden?

Lösung:

Lassen Sie uns diesen Fehler zuerst erstellen, indem Sie das folgende Skript verwenden. Wir werden zwei Tabellen dbo.Customer und dbo.Orders erstellen. Die Tabellen haben Primär-Fremdschlüssel-Beziehung.

USE YourDatabaseName
GO

CREATE 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
    ,Customer_id INT FOREIGN KEY REFERENCES Customer(CustomerId)
    )


    --insert sample data
     insert into dbo.Customer 
    (CustomerId,FName, LName,SSN)
     values
    (1,'Aamir','Shahzad','000-000-00')

    insert into dbo.Orders
    (OrderItemName,OrderItemAmt,Customer_Id)
    values ('TV',1,1)
 
 
So aktualisieren Sie den Datensatz, wenn die Spalte durch die Fremdschlüsseleinschränkung in SQL Server referenziert wird

Nehmen wir nun an, dass Sie der Meinung sind, dass der CustomerId-Wert in dbo.Customer falsch ist und aktualisiert werden muss. Sie haben die folgende Update-Anweisung geschrieben, um die CustomerId auf 100 zu aktualisieren.
    update dbo.Customer
    set Customerid=100
 
Sie erhalten folgende Fehlermeldung.
Msg 547, Ebene 16, Status 0, Zeile 33Die UPDATE-Anweisung steht in Konflikt mit der REFERENCE-Einschränkung "FK__Orders__Customer__1ED998B2". Der Konflikt ist in der Datenbank „YourDatabaseName“, Tabelle „dbo.Orders“, Spalte „Customer_id“ aufgetreten. Die Anweisung wurde beendet.
Da es in der Tabelle „dbo.Orders“ keinen Customer_id-Wert =100 gibt, können Sie nicht aktualisieren den Eintrag in der Referenztabelle. Jetzt dachten Sie, dass wir zuerst die übergeordnete Tabelle reparieren ( dbo.Orders) und dann kann ich die dbo.Customer-Tabelle aktualisieren.
    update dbo.Orders
    set Customer_Id=100
 
 
 Sie haben wieder den unten gezeigten Fehler erhalten, weil CustomerId=100 nicht in der dbo.Customer-Tabelle verfügbar ist.
Msg 547, Level 16, State 0, Line 36The UPDATE-Anweisung steht in Konflikt mit der FOREIGN KEY-Einschränkung „FK__Orders__Customer__1ED998B2 ". Der Konflikt ist in der Datenbank "YourDatabaseName", Tabelle "dbo.Customer", Spalte "Customerid" aufgetreten. Die Anweisung wurde beendet.

Von hier aus können wir mehrere Lösungen anbieten 1) Anstatt den Datensatz zu aktualisieren, fügen Sie den Datensatz in die Referenztabelle (Dbo.Customer) ein, aktualisieren Sie dann den Datensatz in der übergeordneten Tabelle (Dbo.Orders) und löschen Sie schließlich die vorhandenen Datensätze aus der Referenztabelle.
    --Insert Record in Reference Table First
     insert into dbo.Customer 
    (CustomerId,FName, LName,SSN)
     values
    (100,'Aamir','Shahzad','000-000-00')

    --Update the Records in Parent Table 
        update dbo.Orders
    set Customer_Id=100

    --Delete the old record from Reference Table
    Delete from dbo.Customer
    where CustomerId=1
 
 
 Überprüfen Sie jetzt die Datensätze in der Tabelle.
So aktualisieren Sie den Spaltenwert, wenn von der Fremdschlüsseleinschränkung in SQL Server darauf verwiesen wird

2) Deaktivieren Sie die Fremdschlüsselbeschränkung und aktualisieren Sie die Werte manuell Eine andere Lösung kann sein, die Fremdschlüsseleinschränkung zu deaktivieren, die Datensätze zu aktualisieren und den Fremdschlüssel schließlich wieder zu aktivieren.
--Find the Foreign Key Constraint with Table Name
    USE YourDatabaseName
    GO
    Select 
    Schema_name(Schema_id) as SchemaName,
    object_name(Parent_object_id) as TableName,
    name as ForeignKeyConstraintName
    from sys.foreign_keys
 
 
Deaktivieren Sie die Fremdschlüsselbeschränkung mit der folgenden Anweisung
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Beschränkungsname
Ich habe die folgende Anweisung verwendet, um die Fremdschlüsselbeschränkung für die Tabelle dbo.Orders zu deaktivieren.
--Disable Foregin Key by using NOCHECK
ALTER TABLE dbo.Orders
NOCHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E

--Run Update Statements
    update dbo.Customer
    set Customerid=100

    update dbo.Orders
    set Customer_Id=100

Fremdschlüsselbeschränkung aktivieren SyntaxALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Beschränkungsname

Ich führe das folgende Skript aus, um die Fremdschlüsselbeschränkung für die dbo.Orders-Tabelle zu aktivieren.
--Enable Foreign Key Constraint by using CHECK
ALTER TABLE dbo.Orders
CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E


Video-Demo:Die UPDATE-Anweisung stand im Konflikt mit der REFERENCE-Einschränkung