دمج عمودين معًا من جداول منفصلة
-
17-09-2020 - |
سؤال
دعنا نقول على سبيل المثال:
انا لدي طاولتان: 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)
إلا إذا فهمت خطأ..