sql >> Database >  >> RDS >> Sqlserver

De UPDATE-instructie was in strijd met de REFERENCE-beperking - SQL Server / TSQL-zelfstudie, deel 76

Scenario:

U werkt als SQL Server-ontwikkelaar. U schreef een update-instructie voor een van de tabellen en kreeg onderstaande foutmelding.


Msg 547, Level 16, State 0, Line 32
De UPDATE-instructie was in strijd met de REFERENCE-beperking "FK_".
Het conflict deed zich voor in de database "YourDatabaseName", tabel "SchemaName.YourTableName", kolom 'ColumnName'.
De instructie is beëindigd.

Hoe dit probleem op te lossen?

Oplossing:

Laten we eerst deze fout maken door het onderstaande script te gebruiken. We gaan twee tabellen dbo.Customer en dbo.Orders maken. De tabellen hebben een primaire-buitenlandse sleutelrelatie.

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)
 
 
Record bijwerken wanneer naar kolom wordt verwezen door Foreign Key Constraint in SQL Server

Laten we nu eens aannemen dat u vindt dat de CustomerId-waarde onjuist is in dbo.Customer en moet worden bijgewerkt. U hebt onderstaande update-verklaring geschreven om CustomerId bij te werken naar 100.
    update dbo.Customer
    set Customerid=100
 
U krijgt onderstaande foutmelding.
Msg 547, Level 16, State 0, Line 33De UPDATE-instructie was in strijd met de REFERENTIE-beperking "FK__Orders__Customer__1ED998B2". Het conflict deed zich voor in de database "YourDatabaseName", tabel "dbo.Orders", kolom 'Customer_id'. De instructie is beëindigd.
Omdat er geen Customer_id value=100 in de tabel dbo.Orders staat, kunt u niet updaten het record in de referentietabel. Nu dacht je dat laten we eerst de bovenliggende tabel repareren ( dbo.Orders) en dan kan ik de dbo.Customer tabel bijwerken.
    update dbo.Orders
    set Customer_Id=100
 
 
 Opnieuw kreeg u de fout zoals hieronder getoond, omdat we geen CustomerId=100 beschikbaar hebben in de dbo.Klanttabel.
Msg 547, Level 16, State 0, Line 36De UPDATE-instructie conflicteerde met de FOREIGN KEY-beperking "FK__Orders__Customer__1ED998B2 ". Het conflict deed zich voor in database "YourDatabaseName", tabel "dbo.Customer", kolom 'Customerid'. De verklaring is beëindigd.

Vanaf hier kunnen we met meerdere oplossingen komen 1) In plaats van het record bij te werken, voegt u het record toe aan de referentietabel (Dbo.Customer), werkt u het record vervolgens bij in de bovenliggende tabel (Dbo.Orders) en verwijdert u ten slotte de bestaande records uit de referentietabel.
    --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
 
 
 Controleer nu de records in de tabel.
Kolomwaarde bijwerken wanneer ernaar wordt verwezen door Foreign Key Constraint in SQL Server

2) Schakel de Foreign Key-beperking uit en werk de waarden handmatig bij Een andere oplossing kan zijn:schakel de Foreign Key-beperking uit, werk de records bij en schakel tenslotte de Foreign-sleutel weer in.
--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
 
 
Schakel de Foreign Key Constraint uit met behulp van onderstaande instructie
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
Ik heb onderstaande instructie gebruikt om de Foreign Key-beperking op de dbo.Orders-tabel uit te schakelen.
--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

Schakel Foreign Key Constraint SyntaxALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name

Ik voer onderstaand script uit om Foreign Key Constraint in dbo.Orders tabel in te schakelen.
--Enable Foreign Key Constraint by using CHECK
ALTER TABLE dbo.Orders
CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E


Videodemo:de UPDATE-instructie is in strijd met de REFERENCE-beperking

  1. Hoe rijwaarden converteren naar kolommen met dynamische kolommentelling?

  2. Createuser:kon geen verbinding maken met database postgres:FATAL:rol tom bestaat niet

  3. Oracle:exporteer een tabel met blobs naar een .sql-bestand dat opnieuw kan worden geïmporteerd

  4. Hoe ArangoDB op Ubuntu 20.04 te installeren