Comment ne pas copier deux fois la meme ligne ?

Signaler
Messages postés
24
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
7 août 2006
-
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
-
Bonjour a tous


Voila mon probleme, je dois inserer des donnees
venant d'un datafile dans une base de donnee, jusque la aucun
problemes. Seulement le programme doit etre execute toutes les heures,
car le datafile est regulierement mis a jour. Comment ne pas copier
deux fois la meme ligne dans la DB sans avoir a faire un test dans le
programme c++ (Car il y a jusqu'a 40000 lignes et 49 colonnes), mais
plutot dans la requete (si c'est possible) ?


Merci d'avance

4 réponses

Messages postés
259
Date d'inscription
mercredi 3 mai 2006
Statut
Modérateur
Dernière intervention
11 janvier 2010
4
Ne connaissant pas bien du tout MySQL je ne peux émètre qu'une théorie.

Si à la base tu as un fichier à importer, fait le en premier temps dans une table temporaire ou une table qui est là juste pour cet usage (vidée après utilisation).
Puis j'utiliserais une requête de ce genre :

INSERT INTO MaTable (meschamps, ...)
SELECT meschamps, ...
FROM MaTableTemporaire AS tmp
WHERE NOT EXISTS (SELECT *
                                       FROM MaTable as tab                                       WHERE tmp.champ1 tab.champ AND tmp.champ2 tab.champ2) -- etc... pour les autres champs de la table

MaTable est la table de destination
MaTableTemporaire la table dans laquel on fait ses insertion temporaire (d'un fichier)

J'espère que EXISTS existe sur MySQL, normalement c'est un standard ISO.

Plus simple si une clef primaire existe il ne faut faire la comparaison que sur elle.

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
Messages postés
24
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
7 août 2006

Merci pour cette reponse, elle me parait judicieuse, mais dans
quelques jour il y aura des centaines de miliers de lignes a traiter,
et pour 5 types de donnees differentes chaques heures. Ca risque d'etre
tres rapidement tres lourd.


Pour le moment, je prend le timestamp de la premiere ligne du fichier,
je suprimme toute les date ulterieur, et recopie tout, c'est le plus
rapide que j'ai trouve. si quelqu'un a mieux, moins 'barbare', vous
etes bienvenue
Messages postés
698
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
20 mai 2011
2
salut

comment est composé et mis à jour ton fichier de données ?

est ce que le fichier est toujours le meme et modifié. est ce que des lignes sont insérées ?

l'idée serait peut etre d'archiver tes données insrées à l'heure H-1 et de les comparer avec tes données de l'heure H, mais tout depend de tes données et comment le fichier est mis a jour.

sinon as tu une clef primaire de définie dans la table cible ?

Sinon je vois une autre solution bien differente, mais je ne sais pas si MySQL gere les vues.
si oui, tu peux créer une table avec tes données. tu ajoute toutes les heures tes données sans te soucier des doublons, et tu crée une vue qui fait un distinct :
SELECT DISTINCT * FROM matable
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
2
Bonjour,

Si t'as de quoi définir proprement que deux lignes sont identiques, je pense qu'il faut creuser du coté du INSERT IGNORE...

@+ Ordinastie