sql >> Databasteknik >  >> RDS >> Sqlserver

UPDATE-satsen kom i konflikt med REFERENCE-begränsningen - SQL Server / TSQL Tutorial Del 76

Scenario:

Du arbetar som SQL Server-utvecklare, Du skrev en uppdateringssats för en av tabellerna och får felet nedan.


Msg 547, Level 16, State 0, Line 32
UPDATE-satsen kom i konflikt med REFERENCE-begränsningen "FK_".
Konflikten uppstod i databasen "YourDatabaseName", tabell "SchemaName.YourTableName", kolumn "ColumnName".
Utsatsen har avslutats.

Hur löser man problemet?

Lösning:

Låt oss skapa detta fel först genom att använda skriptet nedan. Vi kommer att skapa två tabeller dbo.Customer och dbo.Orders. Tabellerna har en primär-utländsk nyckelrelation.

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)
 
 
Hur man uppdaterar posten när kolumn refereras av Foreign Key Constraint i SQL Server

Låt oss nu säga om du känner att CustomerId-värdet är felaktigt i dbo.Customer och behöver uppdateras. Du skrev nedan uppdaterade uttalande för att uppdatera CustomerId till 100.
    update dbo.Customer
    set Customerid=100
 
Du kommer att få under felet.
Medd. 547, nivå 16, tillstånd 0, rad 33Uppdateringssatsen kom i konflikt med REFERENCE-begränsningen "FK__Orders__Customer__1ED998B2". Konflikten inträffade i databasen "YourDatabaseName", tabellen "dbo.Orders", kolumnen "Customer_id". Uttalandet har avslutats.
Eftersom det inte finns något Customer_id value=100 i tabellen dbo.Orders, kan du inte uppdatera posten i referenstabellen. Nu tänkte du att låt oss fixa den överordnade tabellen först ( dbo.Orders) och sedan kan jag uppdatera tabellen dbo.Customer.
    update dbo.Orders
    set Customer_Id=100
 
 
 Återigen fick du felet som visas nedan, eftersom vi inte har CustomerId=100 tillgängligt i dbo.Kundtabell.
Medd. 547, nivå 16, tillstånd 0, rad 36Uppdateringssatsen stod i konflikt med FOREIGN KEY-begränsningen "FK__Orders__Customer__1ED998B2 ". Konflikten uppstod i databasen "YourDatabaseName", tabell "dbo.Customer", kolumn "Customerid". Uttalandet har avslutats.

Härifrån kan vi komma med flera lösningar 1) Istället för att uppdatera posten, infoga posten i referenstabell ( Dbo.Customer), uppdatera sedan posten i överordnad tabell (Dbo.Orders) och ta slutligen bort de befintliga posterna från referenstabellen.
    --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
 
 
 Kontrollera posterna i tabellen nu.
Hur man uppdaterar kolumnvärde när det refereras av Foreign Key Constraint i SQL Server

2) Inaktivera begränsningen för främmande nyckel och uppdatera värdena manuellt En annan lösning kan vara, inaktivera begränsningen för främmande nyckel, uppdatera posterna och slutligen aktivera den främmande nyckeln 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
 
 
Inaktivera begränsningen för främmande nyckel genom att använda satsen nedan
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
Jag använde satsen nedan för att inaktivera begränsningen för främmande nyckel på tabellen dbo.Orders.
--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

Aktivera syntax för främmande nyckelbegränsning ALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name

Jag kör nedanstående skript för att aktivera utländsk nyckelbegränsning på dbo.Orders-tabellen.
--Enable Foreign Key Constraint by using CHECK
ALTER TABLE dbo.Orders
CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E


Videodemo :UPDATE-satsen stod i konflikt med REFERENS-begränsningen

  1. Hur man utvärderar uttryck i select-sats i Postgres

  2. Vilket är det minsta klientutrymme som krävs för att ansluta C# till en Oracle-databas?

  3. Stöder PostgreSQL transparent komprimering av tabeller (fragment)?

  4. PostgreSQL antal gånger delsträng förekommer i text