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.

Était-ce utile?

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...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top