के साथ डेटा डालें और विदेशी कुंजी सेट करें स्कीमा परिवर्तन के बाद मुझे पोस्टग्रेस डीबी में मौजूदा डेटा की बड़ी मात्रा माइग्रेट करना होगा।पोस्टग्रेस
पुरानी स्कीमा में एक देश विशेषता उपयोगकर्ता तालिका में संग्रहीत की जाएगी। अब देश विशेषता एक अलग पते तालिका में ले जाया गया है:
users:
country # OLD
address_id # NEW [1:1 relation]
addresses:
id
country
स्कीमा वास्तव में अधिक जटिल है और पता सिर्फ देश की तुलना में अधिक होता है। इस प्रकार, प्रत्येक उपयोगकर्ता को अपना पता होना चाहिए (1: 1 संबंध)।
जब डेटा को माइग्रेट, मैं समस्याओं के पते डालने के बाद उन तालिका में विदेशी कुंजी की स्थापना हो रही है:
INSERT INTO addresses (country)
SELECT country FROM users WHERE address_id IS NULL
RETURNING id;
मैं डाला पंक्तियों की आईडी कैसे प्रचार और विदेशी कुंजी सेट करूँ उपयोगकर्ता तालिका में संदर्भ?
एकमात्र समाधान मैं अब तक के पते तालिका में एक अस्थायी user_id स्तंभ बनाने और फिर address_id अपडेट कर रहा है के साथ आ सकता है:
UPDATE users SET address_id = a.id FROM addresses AS a
WHERE users.id = a.user_id;
हालांकि, इस के बावजूद निकला बेहद धीमी गति से होने के लिए (दोनों उपयोगकर्ताओं.आईडी और address.user_id पर सूचकांक का उपयोग कर)।
उपयोगकर्ता तालिका में लगभग 3 मिलियन पंक्तियां हैं जिनमें 300k संबंधित पते हैं।
क्या किसी तालिका में व्युत्पन्न डेटा डालने और दूसरे में डाले गए डेटा के लिए विदेशी कुंजी संदर्भ सेट करने का कोई अन्य तरीका है (स्कीमा को स्वयं किए बिना)?
मैं पोस्टग्रेस 8.3.14 का उपयोग कर रहा हूं।
धन्यवाद
अब मैं एक अजगर/SQLAlchemy स्क्रिप्ट के साथ डेटा को माइग्रेट करने से समस्या हल कर दिया है। एसक्यूएल के साथ कोशिश करने की तुलना में यह बहुत आसान (मेरे लिए) साबित हुआ। फिर भी, अगर कोई पोस्टग्रेस एसक्यूएल में एक इंसर्ट स्टेटमेंट के रिटर्निंग परिणाम को संसाधित करने का तरीका जानता है तो मुझे दिलचस्पी होगी।
यह पुराना है और आपने इसे हल किया है। लेकिन 1: 1 संबंध इस मामले में कोई समझ नहीं आता है। क्या आप इसके बजाय एक देश तालिका नहीं बना रहे हैं? –
एक पते में वास्तव में सड़क, शहर, ज़िप कोड, ... और प्रत्येक उपयोगकर्ता के लिए देश शामिल है। मैंने इसे और अधिक पठनीय बनाने के लिए इसे सरल बना दिया। – Pankrat
देश, ज़िप कोड, शहर, काउंटी इत्यादि सभी की अपनी टेबल होगी। यह सड़क, संख्या इत्यादि छोड़ देता है। फिर भी इनके लिए एक अलग तालिका में कोई बिंदु नहीं है जब तक कि प्रत्येक उपयोगकर्ता के लिए एक से अधिक पता संभव न हो। –