Perbaiki “a foreign key constraint fails” saat mengimpor dump SQL

Impor Anda berhenti di tengah jalan dengan Cannot add or update a child row: a foreign key constraint fails. Datanya baik-baik saja — urutan pernyataan INSERT-nya yang salah. Berikut penyebabnya dan tiga cara memperbaikinya.

Anda mengekspor sebuah database, mencoba memuatnya ke instance yang baru, lalu MySQL menampilkan:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`app`.`orders`, CONSTRAINT `orders_user_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`))

Atau, pada PostgreSQL:

ERROR: insert or update on table "orders" violates foreign key constraint "orders_user_id_fkey"
DETAIL: Key (user_id)=(42) is not present in table "users".

Mengapa ini terjadi

Sebuah foreign key menyatakan “setiap orders.user_id harus mengacu ke users.id yang sudah ada.” Ketika dump menyisipkan orders sebelum users, baris induk yang diacu belum ada, sehingga database menolak baris tersebut.

Kebanyakan alat dump menulis tabel secara alfabetis atau berdasarkan urutan pembuatan — bukan berdasarkan urutan dependensi foreign key. Jadi orders (anak) sering muncul sebelum users (induk), dan impor pun gagal.

Perbaikan 1: Susun ulang INSERT berdasarkan dependensi (perbaikan yang benar)

Solusi yang rapi adalah menyisipkan setiap tabel induk sebelum anak-anaknya. Artinya, uraikan foreign key menjadi graf dependensi dan muat tabel dalam urutan topologis: users → orders → order_items.

Melakukan ini secara manual pada file berukuran beberapa gigabyte itu menyiksa — Anda harus menelusuri setiap FOREIGN KEY di seluruh pernyataan CREATE TABLE dan ALTER TABLE lalu memotong/menempel blok INSERT raksasa dalam urutan yang tepat.

Perbaikan 2: Nonaktifkan pemeriksaan foreign key saat impor

Untuk dump yang lengkap dan sudah konsisten, Anda bisa dengan aman melewati validasi saat memuat. Pada MySQL, bungkus file tersebut:

-- MySQL
SET FOREIGN_KEY_CHECKS = 0;
-- ... semua pernyataan INSERT Anda ...
SET FOREIGN_KEY_CHECKS = 1;

Pada PostgreSQL, tunda constraint di dalam sebuah transaksi:

-- PostgreSQL
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
-- ... semua pernyataan INSERT Anda ...
COMMIT;

Aktifkan kembali pemeriksaan setelahnya agar penulisan berikutnya tetap tervalidasi. Cara ini berhasil, tetapi hanya menutupi masalah urutan — jika dump-nya sebagian, Anda masih bisa berakhir dengan baris yatim (orphaned rows).

Perbaikan 3: Lakukan keduanya secara otomatis dengan DumpCleaner

DumpCleaner membaca dump, mengekstrak setiap foreign key dari CREATE TABLE dan ALTER TABLE, membangun graf dependensi, dan mengekspor file bersih yang langsung bisa diimpor:

  1. Seret dump .sql Anda ke DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite atau MS SQL).
  2. Pilih Urutan INSERT → Berdasarkan dependensi (sadar FK). Induk ditempatkan sebelum anak secara otomatis melalui pengurutan topologis.
  3. Opsional, centang Nonaktifkan pemeriksaan foreign key — DumpCleaner membungkus output dengan pernyataan yang tepat untuk database Anda.
  4. Ekspor. Impor file baru tersebut — error constraint pun hilang.

DumpCleaner bahkan mendeteksi foreign key melingkar (circular) dan memperingatkan Anda alih-alih menghasilkan urutan yang mustahil.

Tidak perlu lagi bedah INSERT manual

DumpCleaner menyusun ulang insert berdasarkan dependensi foreign key pada file berukuran berapa pun — streaming, dengan memori konstan. Aplikasi native macOS & iPadOS, sekali beli.

Unduh di App Store

Pertanyaan yang sering diajukan

Mengapa “a foreign key constraint fails” muncul saat impor?

Sebuah baris anak mengacu ke baris induk yang belum disisipkan, karena dump mengurutkan INSERT secara alfabetis atau berdasarkan waktu pembuatan, bukan berdasarkan dependensi foreign key.

Apakah aman menonaktifkan pemeriksaan foreign key saat impor?

Ya, untuk dump yang lengkap dan konsisten. Anda hanya melewati validasi data yang memang sudah valid di database sumber. Aktifkan kembali pemeriksaan setelahnya.

Bagaimana cara menyusun ulang INSERT tanpa mengedit file secara manual?

DumpCleaner mendeteksi foreign key, membangun graf dependensi, dan mengekspor INSERT dalam urutan topologis — sehingga induk selalu dimuat sebelum anak.

Apakah ini berfungsi untuk PostgreSQL juga?

Ya. DumpCleaner mendukung output pg_dump dan dapat menghasilkan SET CONSTRAINTS ALL DEFERRED serta insert yang terurut berdasarkan dependensi.

Impor dump tanpa pusing soal FK

Seret, susun ulang berdasarkan dependensi, ekspor. DumpCleaner menangani foreign key agar impor Anda langsung berhasil.

Unduh di App Store