سؤال

لدي قاعدة بيانات كبيرة حقًا (تعمل على PostgreSQL) تحتوي على الكثير من الجداول ذات العلاقات المعقدة بينها (المفاتيح الخارجية، وسلسلة الحذف، وما إلى ذلك).أحتاج إلى إزالة بعض البيانات من عدد من الجداول، لكنني لست متأكدًا من كمية البيانات التي سيتم حذفها بالفعل من قاعدة البيانات بسبب عمليات الإزالة المتتالية.

كيف يمكنني التأكد من أنني لن أحذف البيانات التي لا ينبغي حذفها؟

لدي قاعدة بيانات اختبارية - مجرد نسخة من قاعدة بيانات حقيقية حيث يمكنني أن أفعل ما أريد :)

الفكرة الوحيدة التي لدي هي تفريغ قاعدة البيانات قبل وبعد والتحقق منها.لكنها لا تبدو مريحة.فكرة أخرى - تفريغ جزء من قاعدة البيانات، والذي، كما أعتقد، لا ينبغي أن يتأثر ببيانات DELETE الخاصة بي وتحقق من هذا الجزء قبل وبعد إزالة البيانات.لكنني لا أرى طرقًا بسيطة للقيام بذلك (هناك مئات الجداول ويجب أن تعمل عملية الإزالة مع 10 منها تقريبًا).هل هناك طريقة ما للقيام بذلك؟

هل هناك أفكار أخرى لكيفية حل المشكلة؟

هل كانت مفيدة؟

المحلول

يمكنك الاستعلام عن مخطط المعلومات لترسم لنفسك صورة حول كيفية تعريف القيود في قاعدة البيانات.وبعد ذلك ستعرف ما سيحدث عند الحذف.سيكون هذا مفيدًا ليس فقط لهذه الحالة، ولكن دائمًا.

شيء من هذا القبيل (للقيود)

select table_catalog,table_schema,table_name,column_name,rc.* from
information_schema.constraint_column_usage ccu, 
information_schema.referential_constraints rc 
where ccu.constraint_name = rc.constraint_name

نصائح أخرى

باستخدام psql، ابدأ معاملة، وقم بإجراء عمليات الحذف، ثم قم بتشغيل أي استعلامات فحص يمكن أن تخطر ببالك.يمكنك بعد ذلك التراجع أو الالتزام.

إذا كان القلق هو المفاتيح التي تركت متدلية (أي:يشير إلى سجل محذوف) ثم قم بتشغيل الحذف على قاعدة بيانات الاختبار الخاصة بك، ثم استخدم الاستعلامات للعثور على أي مفاتيح تشير الآن إلى أهداف غير صالحة.(أثناء قيامك بذلك، يمكنك أيضًا التأكد من عدم تغيير الجزء الذي يجب ألا يتأثر)

الحل الأفضل هو قضاء بعض الوقت في رسم تسلسلات الحذف حتى تعرف ما يمكن توقعه - معرفة كيفية عمل قاعدة البيانات الخاصة بك أمر ذو قيمة كبيرة لذا فإن الجهد المبذول في هذا سيكون مفيدًا بعد هذا الحذف المحدد.

وبغض النظر عن مدى تأكدك من إعادة قاعدة البيانات قبل إجراء تغييرات كبيرة!

شكرا على الإجابات!

فينكو، إجابتك مفيدة جدًا بالنسبة لي وسأدرسها.

في الواقع، بالنسبة لحالتي، كان يكفي مقارنة عدد الجداول قبل وبعد حذف السجلات والتحقق من الجداول التي تأثرت بها.

تم ذلك عن طريق الأوامر البسيطة الموضحة أدناه

psql -U U_NAME -h`hostname` -c '\d' | awk '{print $3}' > tables.list

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts; done

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts2; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts2; done

diff tables.counts tables.counts2
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top