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

Instrukcja ALTER TABLE kolidowała z ograniczeniem FOREIGN KEY w SQL Server — SQL Sever / TSQL Tutorial, część 69

Scenariusz:

Utworzono dwie tabele dbo.Customer i dbo.Orders bez relacji klucza podstawowego i obcego. Po utworzeniu tabel wstawiłeś kilka rekordów. Później zdałeś sobie sprawę, że powinieneś dodać ograniczenie klucza obcego. Podczas próby zmiany tabeli dbo.Orders wystąpił błąd.

Utwórz tabele dbo.Customer i Dbo.Order za pomocą poniższego skryptu

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,
    CustomerId int
    )
 Wstaw przykładowe rekordy za pomocą poniższego skryptu.

     INSERT INTO dbo.Customer 
    (CustomerId,FName, LName,SSN)
     VALUES
    (1,'Aamir','Shahzad','000-000-00')

    INSERT INTO dbo.Orders
    (OrderItemName,OrderItemAmt,Customerid)
    values ('TV',2,2)
 Teraz dodajmy ograniczenie klucza obcego

    Alter table dbo.Orders
    Add Constraint Fk_CustomerId  
    Foreign Key(CustomerId) References dbo.Customer(CustomerId)
 
 
 Kiedy wykonujemy powyższy skrypt, otrzymujemy błąd poniżej.

Msg 547, Level 16, State 0, Line 31
Instrukcja ALTER TABLE była w konflikcie z ograniczeniem FOREIGN KEY "Fk_CustomerId". Konflikt wystąpił w bazie danych "YourDatabaseName", tabeli "dbo.Customer", kolumnie "Customerid".

Ponieważ dbo.Customer ma wartość 1 dla kolumny CustomerId, a w kolumnie tabeli dbo.Orders CustomerId ma wartość 2 Wartości nie pasują do siebie. To jest powód, dla którego otrzymaliśmy powyższy błąd.

Rozwiązania:

1) Napraw dane w drugiej tabeli (dbo.Orders) Możemy poprawić dane w drugiej tabeli i zaktualizować wartości kolumny CustomerId. Gdy będziemy mieli poprawne dane, które pasują do naszej tabeli podstawowej ( Dbo.Customer.CustomerId), pozwoli nam to bez problemu utworzyć ograniczenie klucza obcego.
2) Użyj opcji Alter Table with Nocheck (Ignoruj ​​istniejące dane ) Jeśli nie zależy Ci na relacji istniejących danych. Możesz użyć With NoCheck z instrukcją alter table i zignoruje to sprawdzenie, aby sprawdzić poprawność danych i utworzyć ograniczenie klucza obcego. Po utworzeniu ograniczenia klucza obcego wymusi ono integralność wszystkich wstawionych nowych rekordów.
    Alter table dbo.Orders with Nocheck
    Add Constraint Fk_CustomerId  
    Foreign Key(CustomerId) References dbo.Customer(CustomerId)
 
 


Video Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zdrowy jest Twój serwer SQL? Proaktywne monitorowanie bazy danych ma kluczowe znaczenie

  2. Jak wstawić dane programu Excel lub CSV do tabeli za pomocą graficznego interfejsu użytkownika w programie SQL Server — samouczek SQL Server / TSQL, część 102

  3. SPRAWDŹ OGRANICZENIE na wielu kolumnach

  4. Włącz pocztę bazy danych w SQL Server (T-SQL)

  5. Użyj TYPE_NAME(), aby uzyskać nazwę typu danych w SQL Server