Dans le cadre d'un projet PHP, je dois insérer une ligne dans une base de données MySQL. Je suis évidemment habitué à faire cela, mais cela nécessitait l'insertion dans 90 colonnes dans une requête. La requête résultante a l'air horrible et monolithique (en particulier en insérant mes variables PHP comme valeurs):
INSERT INTO mytable (column1, colum2, ..., column90)
VALUES
('value1', 'value2', ..., 'value90')
et je crains de ne pas m'y prendre correctement. Il m'a également fallu beaucoup de temps (ennuyeux) pour tout taper et tester l'écriture du code de test sera également fastidieux, je le crains.
Comment les professionnels rédigent-ils et testent-ils rapidement ces requêtes? Existe-t-il un moyen d'accélérer le processus?
php
mysql
efficiency
Joe
la source
la source
Réponses:
Joe, votre dernier commentaire a beaucoup expliqué. Je pense que le vrai problème est la conception des données. De nouvelles colonnes peuvent être nécessaires lorsque le format du document change, et d'après mon expérience, les formats de document ont tendance à changer fréquemment. Au lieu d'une table à 90 colonnes, avec une seule ligne par rapport, je stocke les données du rapport dans une table à quatre colonnes: report_id, format_id, field_name, field_value. Chaque rapport serait représenté par 90 lignes, une pour chaque valeur de champ dans le rapport. Cela devrait considérablement simplifier votre code.
la source
En général, le moyen le plus rapide pour charger un grand ensemble de données dans une base de données SQL consiste à utiliser l'interface de chargement en masse native. Pour autant que je sache, chaque dbms SQL en a au moins un.
Documents MySQL: utilisation du chargeur en bloc
Si je dois transformer un fichier délimité par des tabulations ou des virgules en instructions SQL INSERT, j'utilise awk pour lire le fichier d'entrée et écrire le fichier de sortie. Awk n'a rien de vraiment spécial; il se trouve que c'est le langage de traitement de texte que je connais le mieux. Vous pouvez obtenir les mêmes résultats en écrivant du code en Perl, Python, Ruby, Rexx, Lisp, etc.
la source
Si vous pouvez facilement obtenir les noms de colonne dans une feuille de calcul Excel, vous pouvez écrire des macros Excel pour produire du code pour diverses requêtes et instructions DML, puis collez simplement les valeurs dans une autre colonne et votre instruction d'insertion / mise à jour est créée automatiquement pour vous. La saisie manuelle est un moyen très lent de le faire, alors voyez si vous pouvez trouver des astuces en utilisant vos outils existants. De nombreux éditeurs de texte destinés aux développeurs ont également la possibilité d'enregistrer et de stocker des macros pour rendre les travaux répétitifs comme celui-ci beaucoup plus rapides et plus faciles.
la source
Si vous avez un fichier csv, vous pouvez utiliser LOAD DATA INFILE ... pour importer les données.
Si vous devez utiliser des requêtes 'INSERT', effectuer des insertions en masse accélérera le processus. Au lieu d'exécuter une requête «INSERT» pour chaque ligne, regroupez les lignes, dites 100 et exécutez la requête. Quelque chose comme ça:
la source
Un moyen efficace d'écrire des données de requête multi-colonnes dans la base de données MySQL consiste à convertir ces données au format JSON ou YAML et à les insérer en une seule unité. Il change "écrire un insert pour une table avec 90 colonnes" en "écrire un insert dans une table avec une colonne".
Dans cette approche, tout ne doit pas être décomposé en ses composants de base, et la donnée unique est stockée juste dans 1 colonne.
la source
Avec MySQL, vous pouvez utiliser une syntaxe alternative pour les
insert
instructions:la source
Votre scénario ressemble à un très bon ajustement pour une solution NoSQL, car la liste d'attributs peut changer à chaque fois que le format change. Avez-vous évalué d'autres options que MySQL? Creusez autour de DynamoDB / MongoDB / Cassandra - cela pourrait être un meilleur ajustement.
la source
Il existe un moyen plus efficace d'insérer des données dans la base de données en utilisant php et mysql. Nous pouvons utiliser LOAD COMMAND pour insérer les données. Il insère des données remarquablement rapidement.
Pour cela, créez un fichier plat (par exemple, j'ai utilisé un fichier .csv) avec vos données en utilisant la
fputcsv()
fonction. Insérez ensuite les données à l'aide de la commande LOAD. Syntaxe certains ce qui ressemble à ci-dessous:la source
Essayez ce qui suit. A travaillé pour moi.
Les noms de formulaire doivent être égaux aux noms de colonne de base de données
Obtenez les valeurs comme ci-dessous:
Vous devrez d'abord insérer un ID avant la boucle foreach. vous pouvez obtenir le prochain identifiant en faisant:
ajoutez 1 à id et insérez-le.
la source