Anda mengekspor sebuah database, mencoba memuatnya ke instance yang baru, lalu MySQL menampilkan:
Atau, pada PostgreSQL:
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:
- Seret dump
.sqlAnda ke DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite atau MS SQL). - Pilih Urutan INSERT → Berdasarkan dependensi (sadar FK). Induk ditempatkan sebelum anak secara otomatis melalui pengurutan topologis.
- Opsional, centang Nonaktifkan pemeriksaan foreign key — DumpCleaner membungkus output dengan pernyataan yang tepat untuk database Anda.
- 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 StorePertanyaan 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