Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Instrukcja UPDATE kolidowała z ograniczeniem REFERENCE - SQL Server / TSQL Tutorial, część 76

Scenariusz:

Pracujesz jako programista SQL Server, napisałeś oświadczenie o aktualizacji dla jednej z tabel i pojawił się poniżej błąd.


Msg 547, Level 16, State 0, Line 32
Instrukcja UPDATE kolidowała z ograniczeniem REFERENCE „FK_”.
Wystąpił konflikt w bazie danych "NazwaTwojejBazyDanych", tabela "NazwaSchematu.NazwaTwojejTabeli", kolumna "NazwaKolumny".
Wyciąg został zakończony.

Jak rozwiązać ten problem?

Rozwiązanie:

Najpierw stwórzmy ten błąd za pomocą poniższego skryptu. Zamierzamy stworzyć dwie tabele dbo.Customer i dbo.Orders. Tabele mają relację klucza podstawowego i obcego.

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 zaktualizować rekord, gdy do kolumny odwołuje się ograniczenie klucza obcego w SQL Server

Teraz powiedzmy, czy uważasz, że wartość CustomerId w dbo.Customer jest nieprawidłowa i wymaga aktualizacji. Napisałeś poniżej oświadczenie aktualizujące, aby zaktualizować CustomerId do 100.
    update dbo.Customer
    set Customerid=100
 
Otrzymasz błąd poniżej.
Msg 547, poziom 16, stan 0, wiersz 33. Instrukcja UPDATE była w konflikcie z ograniczeniem REFERENCE „FK__Orders__Customer__1ED998B2”. Konflikt wystąpił w bazie danych "YourDatabaseName", tabeli "dbo.Orders", kolumnie "Customer_id". Wyrażenie zostało zakończone.
Ponieważ w tabeli dbo.Orders nie ma wartości Customer_id=100, nie można zaktualizować rekord w tabeli referencyjnej. Teraz pomyślałeś, że najpierw naprawmy tabelę Parent (dbo.Orders), a potem mogę zaktualizować tabelę dbo.Customer.
    update dbo.Orders
    set Customer_Id=100
 
 
 Ponownie pojawił się błąd, jak pokazano poniżej, ponieważ nie mamy dostępnego CustomerId=100 w tabeli dbo.Customer.
Msg 547, Level 16, State 0, Line 36. Instrukcja UPDATE była w konflikcie z ograniczeniem FOREIGN KEY „FK__Orders__Customer__1ED998B2 ”. Konflikt wystąpił w bazie danych "YourDatabaseName", tabeli "dbo.Customer", kolumnie "Customerid". Oświadczenie zostało zakończone.

Z tego miejsca możemy uzyskać wiele rozwiązań 1) Zamiast aktualizować rekord, Wstaw rekord w tabeli referencyjnej ( Dbo.Customer), następnie zaktualizuj rekord w tabeli nadrzędnej (Dbo.Orders) i na koniec usuń istniejące rekordy z tabeli referencyjnej.
    --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
 
 
 Sprawdź teraz rekordy w tabeli.
Jak zaktualizować wartość kolumny, gdy odwołuje się do niej ograniczenie klucza obcego w programie SQL Server

2) Wyłącz ograniczenie klucza obcego i ręcznie zaktualizuj wartości Innym rozwiązaniem może być wyłączenie ograniczenia klucza obcego, aktualizacja rekordów i ponowne włączenie klucza obcego.
--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
 
 
Wyłącz ograniczenie klucza obcego za pomocą poniższej instrukcji
Składnia ALTER TABLE NazwaSchematu.NazwaTabeliNadrzędnejNOCHECK CONSTRAINT Nazwa_Ograniczenia
Użyłem poniższej instrukcji, aby wyłączyć ograniczenie klucza obcego w tabeli 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

Włącz ograniczenie klucza obcego Składnia ALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name

Wykonuję poniższy skrypt, aby włączyć ograniczenie klucza obcego w tabeli dbo.Orders.
--Enable Foreign Key Constraint by using CHECK
ALTER TABLE dbo.Orders
CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E


Wideo demonstracyjne:instrukcja UPDATE jest w konflikcie z ograniczeniem REFERENCE

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aktualizacja SQL z row_number()

  2. LIMIT 10..20 w SQL Server

  3. Rozwiązania dla INSERT OR UPDATE w SQL Server

  4. Jak zwrócić wszystkie niezaufane ograniczenia kontrolne w programie SQL Server (przykład T-SQL)

  5. Jak mogę wyczyścić pamięć podręczną zapytań programu SQL Server?