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

L'istruzione ALTER TABLE era in conflitto con il vincolo FOREIGN KEY in SQL Server - Tutorial SQL Server/TSQL Parte 69

Scenario:

Hai creato due tabelle dbo.Customer e dbo.Orders senza avere una relazione chiave primaria-estranea. Dopo aver creato le tabelle hai inserito alcuni record. Successivamente ti sei reso conto che dovevi aggiungere il vincolo della chiave esterna. Quando hai provato a modificare dbo.Orders table , hai ricevuto un errore.

Crea tabelle dbo.Customer e Dbo.Order usando lo script sottostante

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
    )
 Inserisci record di esempio utilizzando lo script seguente.

     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)
 Ora aggiungiamo il vincolo di chiave esterna

    Alter table dbo.Orders
    Add Constraint Fk_CustomerId  
    Foreign Key(CustomerId) References dbo.Customer(CustomerId)
 
 
 Quando eseguiamo lo script precedente, otteniamo un errore inferiore.

Msg 547, livello 16, stato 0, riga 31
L'istruzione ALTER TABLE era in conflitto con il vincolo FOREIGN KEY "Fk_CustomerId". Il conflitto si è verificato nel database "YourDatabaseName", tabella "dbo.Customer", colonna 'Customerid'.

Poiché dbo.Customer ha valore 1 per la colonna CustomerId e nella colonna della tabella dbo.Orders CustomerId ha valore 2 I valori non corrispondono tra loro. Questo è il motivo per cui abbiamo ricevuto l'errore precedente.

Soluzioni:

1) Correggi i dati nella seconda tabella (dbo.Orders) Possiamo correggere i dati nella seconda tabella e aggiornare i valori della colonna CustomerId. Una volta che avremo i dati corretti che corrispondono alla nostra tabella primaria ( Dbo.Customer.CustomerId), ci consentirà di creare un vincolo di chiave esterna senza alcun problema.
2) Usa Alter Table con Nocheck ( Ignora i dati esistenti ) Se non ti interessa la relazione dei dati esistenti. È possibile utilizzare With NoCheck con l'istruzione alter table e ignorerà il controllo per convalidare i dati e creare un vincolo di chiave esterna. Una volta creato, il vincolo di chiave esterna imporrà l'integrità per tutti i nuovi record inseriti.
    Alter table dbo.Orders with Nocheck
    Add Constraint Fk_CustomerId  
    Foreign Key(CustomerId) References dbo.Customer(CustomerId)
 
 


Video Demo