سؤال

دعنا نقول على سبيل المثال:

  • انا لدي طاولتان: old_data و بيانات جديدة.

  • كلاهما old_data و بيانات جديدة لديك عمود واحد يسمى this_is_col.

  • كلاهما old_data و بيانات جديدة تحتوي على (مئات) صفوف التواريخ المختلفة (2010-02-06، 2010-01-09، 2007-06-02، وما إلى ذلك).ليس من الضروري أن يحتوي كلا الجدولين على نفس التواريخ، لكن كلاهما لهما نفس التنسيق.

  • حقول كلا الجدولين هي أعداد صحيحة مختلفة.


مهمتي:

  • انسخ الحقول من old_data ل بيانات جديدة.

  • إذا كان هناك تاريخ في كلا الجدولين، فسيتم إدخال الحقل فيه بيانات جديدة سوف يتم استبداله.

  • إذا كان التاريخ غير موجود في بيانات جديدة, ، ثم ستتم إضافة الصف الصحيح وسيتم نسخ الحقل فوقه.


إليكم إلى أي مدى وصلت:

إنشاء عمود مؤقت:

ALTER TABLE `new_data` ADD `tempColumn` TEXT NULL;

نسخ البيانات من old_data:

INSERT INTO `new_data` (`tempColumn`) SELECT `this_is_col` FROM `old_data`;

الجمع بين العمود المؤقت و بيانات جديدة . this_is_col.(لم أحسب هذه الخطوة حقًا لأنني لم أصل إلى هذا الحد).

MERGE? `tempColumn` `this_is_col`;

حذف الجدول المؤقت

ALTER TABLE `new_data` DROP `tempColumn`;

عند تنفيذ الإجراء الثاني (نقل البيانات إلى العمود المؤقت) أحصل على هذا الخطأ:

#1062 - Duplicate entry '0000-00-00' for key 1

والآن أنا عالقة.سيكون موضع تقدير أي مساعدة.أنا أستخدم MySQL وphpMyAdmin لاختبار أوامر SQL.

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

المحلول

بافتراض أن التواريخ مفهرسة كمفاتيح فريدة:

INSERT INTO newtable
SELECT *
FROM oldtable
ON DUPLICATE KEY column1=oldcolumn1, ...

نصائح أخرى

انت تريد إدراج ...على التحديث الرئيسي المكرر.الحل الخاص بك يفي بالفعل بالخطوتين 1 و 3 من مهمتك، عند تحديث المفتاح المكرر سوف يعتني بالخطوة 2.

إذا كنت تفضل حذف الصف أولاً، بدلاً من التحديث: يستبدل

سيكون مجرد سطر واحد أيضًا، لذا:REPLACE data SELECT، لن تضطر إلى القيام بالأمر الغريب بإضافة عمود نصي.

ماذا عن مجرد القيام UPDATE و INSERT?

UPDATE new_data SET col=col 
FROM new_data a join old_data b on a.this_is_col = b.this_is_col

ثم

INSERT INTO new_data (cols) SELECT cols 
FROM old_data WHERE this_is_col NOT IN (SELECT this_is_col FROM new_data)

إلا إذا فهمت خطأ..

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