Comment ne pas copier deux fois la meme ligne ?

IceFinger Messages postés 24 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 7 août 2006 - 2 août 2006 à 15:34
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 - 19 oct. 2006 à 10:30
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

cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
3 août 2006 à 12:28
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
0
IceFinger Messages postés 24 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 7 août 2006
3 août 2006 à 14:41
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
0
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
4 août 2006 à 12:17
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
0
Ordinastie Messages postés 93 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 17 octobre 2008 2
19 oct. 2006 à 10:30
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
0
Rejoignez-nous