आप एक डेटाबेस एक्सपोर्ट करते हैं, उसे एक नए इंस्टेंस में लोड करने की कोशिश करते हैं, और MySQL यह त्रुटि देता है:
या, PostgreSQL पर:
DETAIL: Key (user_id)=(42) is not present in table "users".
ऐसा क्यों होता है
एक फ़ॉरेन की कहती है कि "हर orders.user_id को किसी मौजूदा users.id की ओर इंगित करना चाहिए।" जब डंप orders को users से पहले इन्सर्ट करता है, तो संदर्भित पैरेंट रो अभी तक मौजूद नहीं होती, और डेटाबेस उस रो को अस्वीकार कर देता है।
अधिकांश डंप टूल टेबल को वर्णानुक्रम में या निर्माण क्रम में लिखते हैं — फ़ॉरेन की डिपेंडेंसी क्रम में नहीं। इसलिए orders (चाइल्ड) अक्सर users (पैरेंट) से पहले आ जाती है, और इम्पोर्ट टूट जाता है।
उपाय 1: डिपेंडेंसी के अनुसार INSERT को पुनः क्रमबद्ध करें (सही उपाय)
साफ़-सुथरा समाधान यह है कि हर पैरेंट टेबल को उसके चाइल्ड से पहले इन्सर्ट करें। इसका मतलब है फ़ॉरेन की को एक डिपेंडेंसी ग्राफ़ में हल करना और टेबल को टोपोलॉजिकल क्रम में लोड करना: users → orders → order_items।
मल्टी-गीगाबाइट फ़ाइल में यह हाथ से करना कष्टदायक है — आपको CREATE TABLE और ALTER TABLE स्टेटमेंट में हर FOREIGN KEY को ढूँढना होगा और विशाल INSERT ब्लॉक को सही क्रम में कट/पेस्ट करना होगा।
उपाय 2: इम्पोर्ट के दौरान फ़ॉरेन की चेक अक्षम करें
एक पूर्ण, पहले से ही सुसंगत डंप के लिए आप लोड करते समय सुरक्षित रूप से सत्यापन छोड़ सकते हैं। MySQL पर, फ़ाइल को इस तरह रैप करें:
-- MySQL SET FOREIGN_KEY_CHECKS = 0; -- ... आपके सभी INSERT स्टेटमेंट ... SET FOREIGN_KEY_CHECKS = 1;
PostgreSQL पर, एक ट्रांज़ैक्शन के भीतर कंस्ट्रेंट को डिफ़र करें:
-- PostgreSQL BEGIN; SET CONSTRAINTS ALL DEFERRED; -- ... आपके सभी INSERT स्टेटमेंट ... COMMIT;
बाद में चेक फिर से सक्षम करें ताकि भविष्य की राइट्स सत्यापित रहें। यह काम करता है, लेकिन यह केवल क्रमबद्धता की समस्या को छुपाता है — यदि डंप आंशिक है, तो भी आपको अनाथ रो मिल सकती हैं।
उपाय 3: DumpCleaner के साथ दोनों स्वचालित रूप से करें
DumpCleaner डंप को पढ़ता है, CREATE TABLE और ALTER TABLE से हर फ़ॉरेन की निकालता है, डिपेंडेंसी ग्राफ़ बनाता है, और एक साफ़ फ़ाइल एक्सपोर्ट करता है जो बस इम्पोर्ट हो जाती है:
- अपना
.sqlडंप DumpCleaner में खींचें (MySQL, MariaDB, PostgreSQL, SQLite या MS SQL)। - INSERT क्रम → डिपेंडेंसी के अनुसार (FK-अवगत) चुनें। टोपोलॉजिकल सॉर्ट के ज़रिए पैरेंट को स्वचालित रूप से चाइल्ड से पहले रखा जाता है।
- वैकल्पिक रूप से फ़ॉरेन की चेक अक्षम करें पर टिक करें — यह आउटपुट को आपके डेटाबेस के लिए सही स्टेटमेंट के साथ रैप करता है।
- एक्सपोर्ट करें। नई फ़ाइल इम्पोर्ट करें — कंस्ट्रेंट त्रुटि गायब हो चुकी है।
यह सर्कुलर फ़ॉरेन की का भी पता लगाता है और एक असंभव क्रम बनाने के बजाय आपको चेतावनी देता है।
अब कोई मैन्युअल INSERT सर्जरी नहीं
DumpCleaner किसी भी आकार की फ़ाइलों पर फ़ॉरेन की डिपेंडेंसी के अनुसार इन्सर्ट को पुनः क्रमबद्ध करता है — स्ट्रीमिंग के साथ, स्थिर मेमोरी में। नेटिव macOS और iPadOS ऐप, एकमुश्त खरीद।
App Store पर डाउनलोड करेंअक्सर पूछे जाने वाले प्रश्न
इम्पोर्ट पर "a foreign key constraint fails" क्यों होता है?
एक चाइल्ड रो किसी ऐसी पैरेंट रो को संदर्भित करती है जो अभी तक इन्सर्ट नहीं हुई है, क्योंकि डंप INSERT को फ़ॉरेन की डिपेंडेंसी के बजाय वर्णानुक्रम में या निर्माण समय के अनुसार क्रमबद्ध करता है।
क्या इम्पोर्ट के दौरान फ़ॉरेन की चेक अक्षम करना सुरक्षित है?
हाँ, एक पूर्ण और सुसंगत डंप के लिए। आप केवल उस डेटा का सत्यापन छोड़ रहे हैं जो स्रोत डेटाबेस में पहले से ही मान्य था। बाद में चेक फिर से सक्षम करें।
मैं फ़ाइल को हाथ से संपादित किए बिना INSERT को कैसे पुनः क्रमबद्ध करूँ?
DumpCleaner फ़ॉरेन की का पता लगाता है, एक डिपेंडेंसी ग्राफ़ बनाता है, और INSERT को टोपोलॉजिकल क्रम में एक्सपोर्ट करता है — ताकि पैरेंट हमेशा चाइल्ड से पहले लोड हों।
क्या यह PostgreSQL के लिए भी काम करता है?
हाँ। DumpCleaner pg_dump आउटपुट का समर्थन करता है और SET CONSTRAINTS ALL DEFERRED के साथ-साथ डिपेंडेंसी-क्रमबद्ध इन्सर्ट भी उत्पन्न कर सकता है।
FK की परेशानी के बिना डंप इम्पोर्ट करें
खींचें, डिपेंडेंसी के अनुसार पुनः क्रमबद्ध करें, एक्सपोर्ट करें। DumpCleaner फ़ॉरेन की को संभालता है ताकि आपका इम्पोर्ट बस काम कर जाए।
App Store पर डाउनलोड करें