Anda mengeksport pangkalan data, cuba memuatkannya ke dalam instans baharu, dan MySQL memaparkan:
Atau, pada PostgreSQL:
DETAIL: Key (user_id)=(42) is not present in table "users".
Mengapa ini berlaku
Kunci asing menyatakan “setiap orders.user_id mesti menunjuk kepada users.id yang sedia wujud.” Apabila dump memasukkan orders sebelum users, baris induk yang dirujuk itu belum wujud lagi, lalu pangkalan data menolak baris tersebut.
Kebanyakan alat dump menulis jadual secara abjad atau mengikut susunan penciptaan — bukan mengikut susunan kebergantungan kunci asing. Jadi orders (anak) kerap muncul sebelum users (induk), dan import pun gagal.
Cara 1: Susun semula INSERT mengikut kebergantungan (pembetulan yang betul)
Penyelesaian yang kemas ialah memasukkan setiap jadual induk sebelum anaknya. Ini bermakna menyelesaikan kunci asing menjadi graf kebergantungan dan memuatkan jadual dalam susunan topologi: users → orders → order_items.
Melakukannya secara manual dalam fail bersaiz berbilang gigabait amat memenatkan — anda perlu menjejaki setiap FOREIGN KEY merentasi penyata CREATE TABLE dan ALTER TABLE serta memotong/menampal blok INSERT yang besar dalam urutan yang betul.
Cara 2: Lumpuhkan semakan kunci asing semasa import
Untuk dump yang lengkap dan sudah konsisten, anda boleh melangkau pengesahan dengan selamat semasa memuatkan. Pada MySQL, balut fail seperti berikut:
-- MySQL SET FOREIGN_KEY_CHECKS = 0; -- ... semua penyata INSERT anda ... SET FOREIGN_KEY_CHECKS = 1;
Pada PostgreSQL, tangguhkan kekangan di dalam transaksi:
-- PostgreSQL BEGIN; SET CONSTRAINTS ALL DEFERRED; -- ... semua penyata INSERT anda ... COMMIT;
Aktifkan semula semakan selepas itu supaya tulisan pada masa hadapan kekal disahkan. Ini berkesan, tetapi ia hanya menutup masalah susunan — jika dump itu separa, anda masih boleh berakhir dengan baris yatim.
Cara 3: Buat kedua-duanya secara automatik dengan DumpCleaner
DumpCleaner membaca dump, mengekstrak setiap kunci asing daripada CREATE TABLE dan ALTER TABLE, membina graf kebergantungan, dan mengeksport fail bersih yang terus boleh diimport:
- Seret dump
.sqlanda ke dalam DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite atau MS SQL). - Pilih Susunan INSERT → Mengikut kebergantungan (peka-FK). Induk diletakkan sebelum anak secara automatik melalui isihan topologi.
- Secara pilihan, tandakan Lumpuhkan semakan kunci asing — ia membalut output dengan penyata yang betul untuk pangkalan data anda.
- Eksport. Import fail baharu itu — ralat kekangan sudah hilang.
Ia malah mengesan kunci asing berkitar dan memberi amaran kepada anda daripada menghasilkan susunan yang mustahil.
Tiada lagi pembedahan INSERT secara manual
DumpCleaner menyusun semula insert mengikut kebergantungan kunci asing pada fail sebarang saiz — secara penstriman, dengan memori malar. Aplikasi asli macOS & iPadOS, pembelian sekali sahaja.
Muat turun di App StoreSoalan lazim
Mengapa “a foreign key constraint fails” berlaku semasa import?
Baris anak merujuk baris induk yang belum dimasukkan lagi, kerana dump menyusun INSERT mengikut abjad atau masa penciptaan dan bukan mengikut kebergantungan kunci asing.
Adakah selamat untuk melumpuhkan semakan kunci asing semasa import?
Ya, untuk dump yang penuh dan konsisten. Anda hanya melangkau pengesahan data yang memang sudah sah dalam pangkalan data sumber. Aktifkan semula semakan selepas itu.
Bagaimana saya menyusun semula INSERT tanpa menyunting fail secara manual?
DumpCleaner mengesan kunci asing, membina graf kebergantungan, dan mengeksport INSERT dalam susunan topologi — jadi induk sentiasa dimuatkan sebelum anak.
Adakah ini berfungsi untuk PostgreSQL juga?
Ya. DumpCleaner menyokong output pg_dump dan boleh mengeluarkan SET CONSTRAINTS ALL DEFERRED serta insert yang tersusun mengikut kebergantungan.
Import dump tanpa masalah FK
Seret, susun semula mengikut kebergantungan, eksport. DumpCleaner menguruskan kunci asing supaya import anda terus berjaya.
Muat turun di App Store