sql >> Database >  >> RDS >> Sqlserver

De instructie ALTER TABLE is in strijd met de FOREIGN KEY-beperking in SQL Server - SQL Server / TSQL-zelfstudie, deel 69

Scenario:

U hebt twee tabellen dbo.Customer en dbo.Orders gemaakt zonder een primaire-buitenlandse sleutelrelatie. Na het maken van tabellen heeft u enkele records ingevoegd. Later realiseerde je je dat je een Foreign Key Constraint moest toevoegen. Toen u probeerde dbo.Orders table te wijzigen, kreeg u een foutmelding.

Maak dbo.Customer- en Dbo.Order-tabellen met onderstaand script

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
    )
 Voeg voorbeeldrecords in met behulp van onderstaand script.

     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)
 Laten we nu een Foreign Key Constraint toevoegen

    Alter table dbo.Orders
    Add Constraint Fk_CustomerId  
    Foreign Key(CustomerId) References dbo.Customer(CustomerId)
 
 
 Wanneer we het bovenstaande script uitvoeren, krijgen we onderstaande foutmelding.

Msg 547, Level 16, State 0, Line 31
De ALTER TABLE-instructie was in strijd met de FOREIGN KEY-beperking "Fk_CustomerId". Het conflict deed zich voor in de database "YourDatabaseName", tabel "dbo.Customer", kolom 'Customerid'.

Als dbo.Customer heeft waarde 1 voor CustomerId-kolom en in dbo.Orders-tabelkolom CustomerId heeft waarde 2 De waarden komen niet met elkaar overeen. Dat is de reden waarom we bovenstaande fout hebben ontvangen.

Oplossingen:

1) Herstel de gegevens in de tweede tabel (dbo.Orders) We kunnen de gegevens in de tweede tabel corrigeren en de waarden van de kolom CustomerId bijwerken. Zodra we de juiste gegevens hebben die overeenkomen met onze primaire tabel (Dbo.Customer.CustomerId), kunnen we zonder problemen een Foreign Key Constraint maken.
2) Gebruik Alter Table with Nocheck (Bestaande gegevens negeren ) Als u niet geeft om de relatie tussen bestaande gegevens. U kunt With NoCheck gebruiken met een wijzigingstabelinstructie en het negeert de controle om gegevens te valideren en een Foreign Key Constraint te creëren. Zodra de Foreign Key Constraint is gemaakt, zal deze integriteit afdwingen voor alle nieuwe records die zijn ingevoegd.
    Alter table dbo.Orders with Nocheck
    Add Constraint Fk_CustomerId  
    Foreign Key(CustomerId) References dbo.Customer(CustomerId)
 
 


Video Demo



  1. Een tabel maken in SQL Server (T-SQL)

  2. Postgresql-update met join

  3. Stel de taal in die wordt gebruikt voor datum- en tijdfuncties in MariaDB

  4. Gegevensverlies herstellen met behulp van verzending van logbestanden met vertraagd herstel