Question

Je suis en train de créer un téléchargeur (en utilisant php) pour mon client où ils peuvent sélectionner un fichier CSV (dans un format prédéterminé) sur leur machine à télécharger. Le CSV aura probablement des lignes 4000-5000. Php va traiter le fichier par la lecture de chaque ligne du CSV et de l'insérer directement dans la table DB. Cette partie est facile.

Cependant, idéalement avant d'ajouter ces données à la table de base de données, je voudrais examiner trois des colonnes (A, B et C) et vérifiez si je dispose déjà d'un combo correspondant de ces 3 champs dans la SI table et SO je préférerais METTRE à JOUR cette ligne plutôt que annexant. Si je n'ai pas un combo correspondant de ces 3 colonnes que je veux aller de l'avant et insérer la ligne, les données annexant à la table.

Ma première pensée est que je pouvais faire des colonnes A, B et C un indice unique dans ma table, puis il suffit d'insérer chaque ligne, détecter un « échec » INSERT (en raison de la restriction de mon index unique) en quelque sorte, puis faire la mise à jour. Il semble que cette méthode pourrait être plus efficace que d'avoir à faire une requête distincte SELECT pour chaque ligne juste pour voir si j'ai un combo correspondant déjà dans ma table.

Une troisième approche peut être simplement ajouter TOUT, en utilisant aucun index de MySQL unique et puis saisir que la dernière combinaison unique lorsque le client interroge plus tard cette table. Cependant, je suis en train d'éviter d'avoir une tonne de données inutiles dans ce tableau.

Réflexions sur les meilleures pratiques ou des approches intelligentes?

Était-ce utile?

La solution

Si vous faites les 3 colonnes l'identifiant unique, vous pouvez faire une INSERT avec Duplicate KEY.

INSERT INTO table (a,b,c,d,e,f) VALUES (1,2,3,5,6,7)
  ON DUPLICATE KEY UPDATE d=5,e=6,f=7;

Vous pouvez en savoir plus sur cette technique très pratique ici dans la section MySQL manuel.

Autres conseils

Si vous ajoutez un index unique sur les (A, B, C) colonnes, vous pouvez alors utiliser REMPLACER de le faire dans une déclaration:

  

REPLACE fonctionne exactement comme INSERT,   sauf que si une ancienne ligne de la table   a la même valeur qu'une nouvelle ligne pour un   KEY primaire ou un index UNIQUE, l'ancien   ligne est supprimée avant que la nouvelle rangée est   Inséré ...

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