Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pernyataan UPDATE bertentangan dengan batasan REFERENCE - Tutorial SQL Server / TSQL Bagian 76

Skenario:

Anda bekerja sebagai pengembang SQL Server, Anda menulis pernyataan pembaruan untuk salah satu tabel dan mendapatkan kesalahan di bawah ini.


Msg 547, Level 16, State 0, Line 32
Pernyataan UPDATE bertentangan dengan batasan REFERENCE "FK_".
Konflik terjadi pada database "YourDatabaseName", tabel "SchemaName.YourTableName", kolom 'ColumnName'.
Pernyataan telah dihentikan.

Bagaimana cara mengatasi masalah ini?

Solusi:

Mari kita buat kesalahan ini terlebih dahulu dengan menggunakan skrip di bawah ini. Kita akan membuat dua tabel dbo.Customer dan dbo.Orders. Tabel memiliki Hubungan Primary-Foreign Key.

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)
 
 
Cara memperbarui catatan saat Kolom direferensikan oleh Batasan Kunci Asing di SQL Server

Sekarang katakanlah jika Anda merasa bahwa nilai CustomerId salah di dbo.Customer dan perlu diperbarui. Anda menulis pernyataan pembaruan di bawah ini untuk memperbarui CustomerId ke 100.
    update dbo.Customer
    set Customerid=100
 
Anda akan mendapatkan error di bawah ini.
Msg 547, Level 16, State 0, Line 33Pernyataan UPDATE bertentangan dengan batasan REFERENCE "FK__Orders__Customer__1ED998B2". Konflik terjadi di database "YourDatabaseName", tabel "dbo.Orders", kolom 'Customer_id'.Pernyataan telah dihentikan.
Karena tidak ada nilai Customer_id=100 di tabel dbo.Orders, Anda tidak dapat memperbarui catatan dalam tabel referensi. Sekarang Anda berpikir bahwa mari kita perbaiki tabel Induk terlebih dahulu ( dbo.Orders) dan kemudian saya dapat memperbarui tabel dbo.Customer.
    update dbo.Orders
    set Customer_Id=100
 
 
 Sekali lagi Anda mendapatkan kesalahan seperti yang ditunjukkan di bawah ini, karena kami tidak memiliki CustomerId=100 yang tersedia di tabel dbo.Customer.
Msg 547, Level 16, State 0, Line 36Pernyataan UPDATE bertentangan dengan batasan FOREIGN KEY "FK__Orders__Customer__1ED998B2 ". Konflik terjadi di database "YourDatabaseName", tabel "dbo.Customer", kolom 'Customerid'.Pernyataan telah dihentikan.

Dari sini kita bisa datang dengan beberapa solusi 1) Alih-alih memperbarui catatan, Sisipkan catatan di Tabel Referensi ( Dbo.Customer), Kemudian perbarui catatan di tabel Induk (Dbo.Orders) dan terakhir hapus catatan yang ada dari Tabel Referensi.
    --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
 
 
 Periksa catatan dalam tabel sekarang.
Cara memperbarui Nilai Kolom saat dirujuk oleh Batasan Kunci Asing di SQL Server

2) Nonaktifkan Batasan Kunci Asing dan Perbarui Nilai Secara Manual Solusi lain dapat berupa, nonaktifkan batasan Kunci Asing, perbarui catatan dan terakhir aktifkan kunci Asing lagi.
--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
 
 
Nonaktifkan Batasan Kunci Asing dengan menggunakan pernyataan di bawah ini
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
Saya menggunakan pernyataan di bawah ini untuk menonaktifkan batasan Foreign Key pada tabel 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

Aktifkan Batasan Kunci Asing SyntaxALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name

Saya menjalankan skrip di bawah ini untuk Mengaktifkan Batasan Kunci Asing pada tabel dbo.Orders.
--Enable Foreign Key Constraint by using CHECK
ALTER TABLE dbo.Orders
CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E


Demo Video :Pernyataan UPDATE bertentangan dengan Batasan 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. referensi yang belum terselesaikan ke objek [INFORMATION_SCHEMA].[TABLES]

  2. Php memanggil skrip database cadangan sqlserver, file cadangan dibuat dan kemudian dihapus

  3. Memformat Nomor Telepon di SQL Server (T-SQL)

  4. Apakah Ada Risiko Keamanan yang Terlibat Dengan Spotlight Cloud Monitoring?

  5. Cara Menghindari Monitor Aktivitas Menyakiti Kinerja SQL Server Anda