sql >> Databáze >  >> RDS >> Sqlserver

Příkaz UPDATE byl v konfliktu s omezením REFERENCE - SQL Server / TSQL výukový program, část 76

Scénář:

Pracujete jako vývojář SQL Server, napsali jste aktualizační příkaz pro jednu z tabulek a dostáváte chybu níže.


Zpráva 547, úroveň 16, stav 0, řádek 32
Příkaz UPDATE byl v konfliktu s omezením REFERENCE "FK_".
Konflikt nastal v databázi "YourDatabaseName", tabulce "SchemaName.YourTableName", sloupci 'ColumnName'.
Příkaz byl ukončen.

Jak tento problém vyřešit?

Řešení:

Pojďme nejprve vytvořit tuto chybu pomocí níže uvedeného skriptu. Vytvoříme dvě tabulky dbo.Customer a dbo.Orders. Tabulky mají vztah primární-cizí klíč.

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)
 
 
Jak aktualizovat záznam, když na sloupec odkazuje omezení cizího klíče na serveru SQL

Nyní řekněme, zda máte pocit, že hodnota CustomerId je v dbo.Customer nesprávná a je třeba ji aktualizovat. Níže jste napsali prohlášení o aktualizaci pro aktualizaci CustomerId na 100.
    update dbo.Customer
    set Customerid=100
 
Dostanete se pod chybu.
Zpráva 547, úroveň 16, stav 0, řádek 33 Příkaz UPDATE byl v konfliktu s omezením REFERENCE "FK__Orders__Customer__1ED998B2". Ke konfliktu došlo v databázi "YourDatabaseName", tabulce "dbo.Orders", sloupci 'Customer_id'. Příkaz byl ukončen.
Vzhledem k tomu, že v tabulce dbo.Orders není žádná hodnota Customer_id value=100, nemůžete aktualizovat záznam v referenční tabulce. Nyní jste si mysleli, že nejprve opravíme nadřazenou tabulku (dbo.Orders) a poté mohu aktualizovat tabulku dbo.Customer.
    update dbo.Orders
    set Customer_Id=100
 
 
 Opět došlo k chybě, jak je uvedeno níže, protože v tabulce dbo.Customer nemáme k dispozici CustomerId=100.
Zpráva 547, úroveň 16, stav 0, řádek 36 Příkaz UPDATE byl v konfliktu s omezením FOREIGN KEY "FK__Orders__Customer_21ED998 ". Ke konfliktu došlo v databázi "YourDatabaseName", tabulce "dbo.Customer", sloupci 'Customerid'. Příkaz byl ukončen.

Odtud můžeme přijít s více řešeními 1) Místo aktualizace záznamu vložte záznam do referenční tabulky (Dbo.Customer), poté aktualizujte záznam v nadřazené tabulce (Dbo.Orders) a nakonec odstraňte existující záznamy z referenční tabulky.
    --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
 
 
 Nyní zkontrolujte záznamy v tabulce.
Jak aktualizovat hodnotu sloupce, když na něj odkazuje omezení cizího klíče na serveru SQL

2) Deaktivujte omezení cizího klíče a aktualizujte hodnoty ručně Dalším řešením může být deaktivace omezení cizího klíče, aktualizace záznamů a nakonec znovu povolení cizího klíče.
--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
 
 
Zakažte omezení cizího klíče pomocí níže uvedeného příkazu
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Název_mezi
Použil jsem níže uvedený příkaz k deaktivaci omezení cizího klíče v tabulce 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

Enable Foreign Key Constraint SyntaxALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name

Spustím níže uvedený skript pro povolení omezení cizího klíče v tabulce dbo.Orders.
--Enable Foreign Key Constraint by using CHECK
ALTER TABLE dbo.Orders
CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E


Video ukázka:Prohlášení UPDATE bylo v rozporu s omezením REFERENCE

  1. Neo4j - Pusťte index pomocí Cypher

  2. Připojte se k fóru otázek a odpovědí pro vývojáře

  3. [Video] Síla indexování v PostgreSQL

  4. Sloupec Postgresql nebyl nalezen, ale zobrazuje se v popisu