Combiner les deux colonnes de tables distinctes
-
17-09-2020 - |
Question
Disons, par exemple:
J'ai deux tables: old_data et new_data.
Les deux old_data et new_data avoir une colonne appelée this_is_col.
Les deux old_data et new_data ont différents (des centaines) de lignes de dates (2010-02-06, 2010-01-09, 2007-06-02, etc.).Les deux tables n'ont pas forcément les mêmes dates, mais ils ont tous deux le même format.
Les champs des deux tables sont différents des entiers.
Ma tâche:
Copiez le champs de old_data pour new_data.
Si la date existe dans les deux tableaux, le champ dans new_data sera remplacé.
Si la date n'existe pas dans new_data, puis la bonne ligne sera ajouté et le champ sera copié.
Ici c'est la façon dont j'ai obtenu:
Créer un temporaire de la colonne:
ALTER TABLE `new_data` ADD `tempColumn` TEXT NULL;
Copier des données à partir de old_data:
INSERT INTO `new_data` (`tempColumn`) SELECT `this_is_col` FROM `old_data`;
Combiner temporaire de la colonne et new_data . this_is_col.(Je n'ai pas très bien compris cette étape, puisque je n'ai pas réussi à faire de ce jour).
MERGE? `tempColumn` `this_is_col`;
Supprimer une table temporaire
ALTER TABLE `new_data` DROP `tempColumn`;
Lors de l'exécution de la deuxième action (transfert de données sur le temporaire de la colonne), j'obtiens cette erreur:
#1062 - Duplicate entry '0000-00-00' for key 1
Et maintenant je suis coincé.Toute aide serait appréciée.Je suis de l'utilisation de MySQL et phpMyAdmin pour tester les commandes SQL.
La solution
En supposant que vos dates sont indexés comme des clés uniques:
INSERT INTO newtable
SELECT *
FROM oldtable
ON DUPLICATE KEY column1=oldcolumn1, ...
Autres conseils
vous voulez INSÉRER ...SUR LE DOUBLE DE LA CLÉ DE MISE À JOUR.votre solution déjà satisfait les étapes 1 et 3 de votre tâche, SUR le DOUBLE de la CLÉ de mise à JOUR prendra soin de l'étape 2.
Si vous préférez supprimer la ligne en premier, au lieu de la mise à jour: REMPLACER
Il s'agit juste d'une ligne de trop, donc:REMPLACER les données de la SÉLECTIONNEZ, vous n'auriez pas à faire l'étrangeté, avec l'ajout d'une colonne de texte.
Que diriez-vous simplement faire un UPDATE
et INSERT
?
UPDATE new_data SET col=col
FROM new_data a join old_data b on a.this_is_col = b.this_is_col
Alors
INSERT INTO new_data (cols) SELECT cols
FROM old_data WHERE this_is_col NOT IN (SELECT this_is_col FROM new_data)
À moins que j'ai mal compris...