sql >> Database teknologi >  >> RDS >> Sqlserver

UPDATE-sætningen var i konflikt med REFERENCE-begrænsningen - SQL Server / TSQL Selvstudium, del 76

Scenarie:

Du arbejder som SQL Server-udvikler. Du skrev en opdateringssætning til en af ​​tabellerne og får fejlen nedenfor.


Msg 547, Level 16, State 0, Line 32
UPDATE-sætningen var i konflikt med REFERENCE-begrænsningen "FK_".
Konflikten opstod i databasen "YourDatabaseName", tabel "SchemaName.YourTableName", kolonnen 'ColumnName'.
Sætningen er blevet afsluttet.

Hvordan løser man dette problem?

Løsning:

Lad os først oprette denne fejl ved at bruge nedenstående script. Vi skal lave to tabeller dbo.Customer og dbo.Orders. Tabellerne har primær-udenlandsk nøglerelation.

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)
 
 
Sådan opdateres posten, når der henvises til kolonnen af ​​Foreign Key Constraint i SQL Server

Lad os nu sige, hvis du føler, at CustomerId-værdien er forkert i dbo.Customer og skal opdateres. Du skrev nedenstående opdateringserklæring for at opdatere CustomerId til 100.
    update dbo.Customer
    set Customerid=100
 
Du vil få fejlen under.
Besked 547, niveau 16, tilstand 0, linje 33. UPDATE-sætningen var i konflikt med REFERENCE-begrænsningen "FK__Orders__Customer__1ED998B2". Konflikten opstod i databasen "YourDatabaseName", tabel "dbo.Orders", kolonne 'Customer_id'. Udsagnet er blevet afsluttet.
Da der ikke er nogen Customer_id value=100 i dbo.Orders-tabellen, kan du ikke opdatere posten i referencetabel. Nu tænkte du, at lad os reparere overordnede tabellen først ( dbo.Orders), og så kan jeg opdatere tabellen dbo.Customer.
    update dbo.Orders
    set Customer_Id=100
 
 
 Igen fik du fejlen som vist nedenfor, fordi vi ikke har CustomerId=100 tilgængelig i dbo.Kundetabel.
Besked 547, niveau 16, tilstand 0, linje 36. UPDATE-sætningen var i konflikt med FOREIGN KEY-begrænsningen "FK__Orders__Customer__1ED998B2 ". Konflikten opstod i databasen "YourDatabaseName", tabel "dbo.Customer", kolonne 'Customerid'. Erklæringen er blevet afsluttet.

Herfra kan vi komme med flere løsninger 1) I stedet for at opdatere posten, Indsæt posten i Referencetabel ( Dbo.Customer), Opdater derefter posten i Overordnet tabel (Dbo.Orders) og slet til sidst de eksisterende poster fra Referencetabel.
    --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
 
 
 Tjek posterne i tabellen nu.
Sådan opdaterer du kolonneværdi, når der refereres til af Foreign Key Constraint i SQL Server

2) Deaktiver fremmednøglebegrænsningen og opdater værdierne manuelt En anden løsning kan være at deaktivere Foreign Key-begrænsningen, opdatere posterne og til sidst aktivere Foreign-nøglen igen.
--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
 
 
Deaktiver Foreign Key Constraint ved at bruge nedenstående sætning
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
Jeg brugte nedenstående sætning til at deaktivere Foreign Key constraint på dbo.Orders-tabellen.
--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

Aktiver Foreign Key Constraint SyntaxALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name

Jeg udfører nedenstående script for at aktivere Foreign Key Constraint på dbo.Orders-tabellen.
--Enable Foreign Key Constraint by using CHECK
ALTER TABLE dbo.Orders
CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E


Videodemo :UPDATE-sætningen var i konflikt med REFERENCE-begrænsningen

  1. NHibernate-kortlægning for Oracle INTERVAL DAG TIL ANDEN datatype

  2. Hvordan behandler MySQL ORDER BY og LIMIT i en forespørgsel?

  3. Hvordan returnerer jeg heltal og numeriske kolonner fra MySQL som heltal og numeriske i PHP?

  4. Administration af høj tilgængelighed i PostgreSQL – Del II:Replikeringsmanager