Bonjour, je voudrais importer des données contenues dans un fichier excel vers 1 table de ma base dans mysql via MySQL Administrator, comment faire?
Toutes les recherches que j'ai faites portent sur PHPMyAdmin.
Merci d'avance!!!
Version imprimable
Bonjour, je voudrais importer des données contenues dans un fichier excel vers 1 table de ma base dans mysql via MySQL Administrator, comment faire?
Toutes les recherches que j'ai faites portent sur PHPMyAdmin.
Merci d'avance!!!
bonjour,
MySql dispose de l'outil intégré suivant : http://dev.mysql.com/doc/refman/5.6/en/load-data.html
Pour les programmes tierces vous devriez vous rapprochez des forums adéquates (l'éditeur)
En interface d'admin vous pouvez sinon utilisez MySql WorkBench qui sais faire ce genre de chose, et est maintenu par Oracle.
Bonjour
Pourriez-vous me donner plus de détails sur l'outil à utiliser sur Mysql Workbench !
Je suis débutante et j suis pas très forte en Anglais (Le manuel est en Anglais)
Merci d'avance !
Salut coeur de pirat.
Voici un exemple d'utilisation du "load local infile".
Et voici le fichier à télécharger :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 -------------- SET AUTOCOMMIT = 0 -------------- -------------- START TRANSACTION -------------- -------------- DROP DATABASE IF EXISTS `base` -------------- -------------- CREATE DATABASE IF NOT EXISTS `base` DEFAULT CHARACTER SET `latin1` DEFAULT COLLATE `latin1_general_ci` -------------- -------------- DROP TABLE IF EXISTS Cities -------------- -------------- CREATE TABLE Cities ( Country CHAR(2), City CHAR(22), AccentCity CHAR(3), Region CHAR(2), Population INT UNSIGNED NULL DEFAULT NULL, Latitude FLOAT, Longitude FLOAT, Date DATETIME ) ENGINE=InnoDB DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci` ROW_FORMAT=COMPRESSED -------------- -------------- TRUNCATE Cities -------------- -------------- set unique_checks = 0 -------------- -------------- set foreign_key_checks = 0 -------------- -------------- set sql_log_bin = 0 -------------- -------------- alter table Cities DISABLE KEYS -------------- -------------- commit -------------- -------------- LOAD DATA LOCAL INFILE 'fichier.txt' INTO TABLE `Cities` CHARACTER SET latin1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 0 LINES (@F1, @F2, @F3, @F4, Population, Latitude, Longitude, @F8) set Country = trim(@F1), City = trim(@F2), AccentCity = trim(@F3), Region = trim(@F4), Date = outils.chgdate(@F8) -------------- -------------- commit -------------- -------------- alter table Cities ENABLE KEYS -------------- -------------- set unique_checks = 1 -------------- -------------- set foreign_key_checks = 1 -------------- -------------- set sql_log_bin = 1 -------------- -------------- commit -------------- -------------- select concat('>', Country, '<') as 'Country', concat('>', City, '<') as 'City', concat('>', AccentCity,'<') as 'AccentCity', concat('>', Region, '<') as 'Region', concat('>', Population,'<') as 'Population', concat('>', Latitude, '<') as 'Latitude', concat('>', Longitude, '<') as 'Longitude', concat('>', date, '<') as 'Date' from `Cities` -------------- +---------+-----------------------+------------+--------+------------+----------+-----------+-----------------------+ | Country | City | AccentCity | Region | Population | Latitude | Longitude | Date | +---------+-----------------------+------------+--------+------------+----------+-----------+-----------------------+ | >fr< | >dijon bourgogne< | >---< | >bo< | >500000< | >200< | >150< | >2015-12-10 15:20:00< | | >fr< | >paris ile de france< | >---< | >il< | >2000000< | >100< | >50< | >2015-06-15 07:15:00< | | >fr< | >nice paca< | >---< | >pa< | >100000< | >250< | >75< | >2015-07-25 19:58:00< | | >fr< | >marseille paca< | >---< | >pa< | >3000< | >750< | >15< | >2015-03-12 19:58:00< | +---------+-----------------------+------------+--------+------------+----------+-----------+-----------------------+ -------------- COMMIT -------------- -------------- SET AUTOCOMMIT = 0 -------------- Appuyez sur une touche pour continuer...
Si tu as des questions, n"hésite pas ! :DCode:
1
2
3
4 "fr","dijon bourgogne","---","bo","500000","200","150","10/12/2015 15:20" "fr","paris ile de france","---","il","2000000","100","50","15/06/2015 07:15" "fr","nice paca","---","pa","100000","250","75","25/07/2015 19:58" "fr","marseille paca","---","pa","3000","750","15","12/03/2015 19:58"
@+
Bonsoir Artemus24
Merci pour ta réponse :) Enfaite j'ai finit par trouver le moyen de le faire après 2 jours de recherches ! ce qui est énorme car finalement c'est simple, j'avais pas a coder ! Par contre j'aimerai bien savoir ton code c'est sur quel Outil mysql tu l'as fait et c'est quoi (du Xml ?)
Y'a un outil dans Mysql workbench qui m'importe le fichier en format .CSV par contre j'ai fait en sorte d'avoir le même nombre de colonnes et même nom aussi que mon fichier Excel.
Cependant, dans ma base j'ai plusieurs table et mon fichier Excel contient des informations sur l'ensemble des tables , du coup il va falloir faire des scripts Sql pour arriver à mettre ces données au bon endroit dans ma BDD.
Si vous avez des suggestions ou des travaux déjà existants a me proposer Volontiers :D
Merci encore
Salut coeur de pirat.
Le script que je t'ai donné, c'est du MySql. Il a été testé dans la version MySql 5.7.12.Citation:
Envoyé par Coeur de pirat
Pourquoi parles-tu de XML ? L'exemple que je t'ai donné est en rapport avec ".csv" ?
As-tu aussi besoin de charger des fichiers de type ".xml" ?
Le XML est L'Extensible Markup Language.
C'est un moyen de codifier les données afin de les transférer entre par exemple un client et un serveur avec ajax.
MySql Workbench, je ne connais pas. L'exemple que je t'ai donné, est un outil standard à MySql, qui permet de charger des données depuis un fichier de type ".csv".Citation:
Envoyé par Coeur de pirat
Il n'est pas nécessaire de faire des tas de scripts pour dispatcher vos données dans les bonnes tables.Citation:
Envoyé par Coeur de pirat
Vous créez une table de travail qui sera à l'identique de votre fichier Excel au format ".csv".
Je suis parti ici, où votre fichier Excel contient un seul type de lignes à charger.
Ensuite, il suffit de créer des requêtes pour venir remplir vos différentes tables.
Dans votre fichier Excel, il faudra créer autant de table de travail qu'il y a de lignes de types différentes.
Le mieux est de nous donner un exemple de ce que vous avez dans votre fichier et ce que vous désirez faire, au final.
--> fichier Excel avec descriptif de vos colonnes dans la ligne et de vos lignes différentes.
--> un jeu d'essai
--> un descriptif DDL de vos tables.
Ne me donner pas l'intégralité de toutes vos tables MySql, mais juste une table qui sera représentatif de ce que vous voulez faire.
Le reste sera du même gabarit !
@+
Bonsoir Artemus 24
C'est un-peu compliqué , moi même je n'ai pas cerné la problématique !
Mais en gros j'ai un PDF à coté avec toutes les informations à ajouter dans la base, j'ai des informations provenant d'un constructeur et la je devrai ajouter des informations provenant d'un autre constructeur "IBM" par exemple.
mon fichier Excel contient plusieurs colonnes qui se référent a mon fichier PDF mais pas toutes les colonnes (je ne vais pas les utiliser pour le moment) car non présente dans le fichier PDF.
Je vais vous montrer quelques tables de ma Base (car je ne devrai pas dévoiler les informations de mon entreprise)
et un fichier Excel, j’espère que vous aller comprendre de quoi il s'agit!
Pièce jointe 207520
Pièce jointe 207521
Merci pour votre aide
Bonne fin de soirée !
Salut coeur de pirat.
Voici l'idée de la façon dont tu dois procéder pour charger tes fichiers Excel.
1) Création de toutes les tables, à vide.
2) chargement du fichier Excel dans la table de nom travail.
3) extraction depuis la table de travail des colonnes et rangement dans les bonnes tables.
Par exemple :
--> colonne découpage dans table 'nature'.
--> colonne forme dans table 'image'.
--> nom_constructeur dans table 'constructeur'.
4) recherche des liens (id...) pour reconstituer les clefs étrangères.
--> recherche idNature dans la table nature, à partir de la colonne decoupage de la table travail.
--> recherche idImage dans la table image, à partir de la colonne forme de la table travail.
--> recherche idConstructeur dans la table constructeur, à partir de la colonne nom_constructeur de la table travail.
5) reconstitution de la table travail, à partir des tables de la base de données.
Et voici comment j'ai procédé :
Je n'ai pas tout traité. J'ai fait en sorte de te montrer comment procéder au chargement des tables.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236 -------------- set autocommit = 0 -------------- -------------- start transaction -------------- -------------- DROP DATABASE IF EXISTS `base` -------------- -------------- CREATE DATABASE `base` default character set `latin1` default collate `latin1_general_ci` -------------- -------------- DROP TABLE IF EXISTS `image` -------------- -------------- CREATE TABLE `image` ( `idImage` integer unsigned not null auto_increment primary key, `image` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `nature` -------------- -------------- CREATE TABLE `nature` ( `idNature` integer unsigned not null auto_increment primary key, `nature` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `constructeur` -------------- -------------- CREATE TABLE `constructeur` ( `idConstructeur` integer unsigned not null auto_increment primary key, `nom` varchar(255) not null, `adresse` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `model` -------------- -------------- CREATE TABLE `model` ( `idModel` integer unsigned not null auto_increment primary key, `modelNumber` varchar(255) not null, `idNature` integer unsigned not null, `idImage` integer unsigned not null, `idConstructeur` integer unsigned not null, CONSTRAINT `FK_Nature` FOREIGN KEY (`idNature`) REFERENCES `nature` (`idNature`) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT `FK_Image` FOREIGN KEY (`idImage`) REFERENCES `image` (`idImage`) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT `FK_Constructeur` FOREIGN KEY (`idConstructeur`) REFERENCES `constructeur` (`idConstructeur`) ON DELETE RESTRICT ON UPDATE CASCADE ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `travail` -------------- -------------- CREATE TABLE `travail` ( `id` integer unsigned not null auto_increment primary key, `nom_constructeur` varchar(255) not null, `model_number` varchar(255) not null, `serie` varchar(255) not null, `decoupage` varchar(255) not null, `forme` varchar(255) not null, `type_capteur` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- LOAD DATA LOCAL INFILE 'fichier.txt' INTO TABLE `travail` CHARACTER SET latin1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 0 LINES (@C1, @C2, @C3, @C4, @C5, @C6, @C7, @C8) set nom_constructeur = trim(@C1), model_number = trim(@C2), serie = trim(@C3), decoupage = trim(@C4), forme = trim(@C5), type_capteur = trim(@C6) -------------- -------------- select * from travail -------------- +----+------------------+--------------+-------+-----------+---------------+--------------+ | id | nom_constructeur | model_number | serie | decoupage | forme | type_capteur | +----+------------------+--------------+-------+-----------+---------------+--------------+ | 1 | IBM | Modele 1 | 32 | linéaire | rectangulaire | ang | | 2 | BULL | Modele 75 | 44 | linéaire | rectangulaire | imm | | 3 | IBM | Modele 3 | 32 | linéaire | rectangulaire | ang | | 4 | SUN MACHINE | Modele 12 | 12 | linéaire | rectangulaire | imm | | 5 | IBM | Modele 2 | 25 | linéaire | rectangulaire | ang | | 6 | IBM | Modele 4 | 32 | linéaire | rectangulaire | imm | +----+------------------+--------------+-------+-----------+---------------+--------------+ -------------- insert into constructeur (`nom`,`adresse`) select nom_constructeur as nom, 'bla bla bla' as adresse from travail group by nom_constructeur -------------- -------------- select * from constructeur -------------- +----------------+-------------+-------------+ | idConstructeur | nom | adresse | +----------------+-------------+-------------+ | 1 | BULL | bla bla bla | | 2 | IBM | bla bla bla | | 3 | SUN MACHINE | bla bla bla | +----------------+-------------+-------------+ -------------- insert into `image` (`image`) select forme as image from travail group by forme -------------- -------------- select * from image -------------- +---------+---------------+ | idImage | image | +---------+---------------+ | 1 | rectangulaire | +---------+---------------+ -------------- insert into `nature` (`nature`) select decoupage as nature from travail group by decoupage -------------- -------------- select * from nature -------------- +----------+----------+ | idNature | nature | +----------+----------+ | 1 | linéaire | +----------+----------+ -------------- insert into model (`modelNumber`,`idNature`,`idImage`,`idConstructeur`) select model_number as modelNumber, (select idNature from nature as n where n.nature = t.decoupage) as idNature, (select idImage from image as i where i.image = t.forme) as IdImage, (select idConstructeur from constructeur as c where c.nom = t.nom_constructeur) as IdConstructeur from travail as t group by model_number, 2, 3, 4 -------------- -------------- select * from model -------------- +---------+-------------+----------+---------+----------------+ | idModel | modelNumber | idNature | idImage | idConstructeur | +---------+-------------+----------+---------+----------------+ | 1 | Modele 1 | 1 | 1 | 2 | | 2 | Modele 12 | 1 | 1 | 3 | | 3 | Modele 2 | 1 | 1 | 2 | | 4 | Modele 3 | 1 | 1 | 2 | | 5 | Modele 4 | 1 | 1 | 2 | | 6 | Modele 75 | 1 | 1 | 1 | +---------+-------------+----------+---------+----------------+ -------------- select c.nom as nom_constructeur, m.modelNumber as model_number, n.nature as decoupage, i.image as forme from model as m inner join constructeur as c on c.idConstructeur = m.idConstructeur inner join nature as n on n.idNature = m.idNature inner join image as i on i.idImage = m.idImage -------------- +------------------+--------------+-----------+---------------+ | nom_constructeur | model_number | decoupage | forme | +------------------+--------------+-----------+---------------+ | IBM | Modele 1 | linéaire | rectangulaire | | SUN MACHINE | Modele 12 | linéaire | rectangulaire | | IBM | Modele 2 | linéaire | rectangulaire | | IBM | Modele 3 | linéaire | rectangulaire | | IBM | Modele 4 | linéaire | rectangulaire | | BULL | Modele 75 | linéaire | rectangulaire | +------------------+--------------+-----------+---------------+ -------------- commit -------------- -------------- set autocommit = 1 -------------- Appuyez sur une touche pour continuer...
@+
Hello Artemus 24
Merci beaucoup pour ta réponse qui m'est vraiment précieuse car je suis tombée sur cette technique mais que j'avais pas bien saisi, du coup j'avais un doute !
Donc j'utilise bien ma table que j'avais créé pour charger le fichier .CSV (dans ton exemple "travail") et je fais par la suite le lien entre toutes les autres tables de ma BDD, petit souci, je travaille avec une BDD déjà créée et chargée aussi , elle n'est pas vide , est ce que ça va marcher quand même ?
Par ailleurs, j'aurai quand même quelques questions :
La procédure je l'ai bien saisi, par contre j'aimerai bien avoir plus d'explications sur ce codeSurtout au niveau des @C1,...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 LOAD DATA LOCAL INFILE 'fichier.txt' INTO TABLE `travail` CHARACTER SET latin1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 0 LINES (@C1, @C2, @C3, @C4, @C5, @C6, @C7, @C8) set nom_constructeur = trim(@C1), model_number = trim(@C2), serie = trim(@C3), decoupage = trim(@C4), forme = trim(@C5), type_capteur = trim(@C6)
ainsi que le dernier codeEn tout cas c'est plus claire pour moi , maintenant j'ai une piste à exploiter :) Merci beaucoupCode:
1
2
3
4
5
6
7
8
9
10
11 select c.nom as nom_constructeur, m.modelNumber as model_number, n.nature as decoupage, i.image as forme from model as m inner join constructeur as c on c.idConstructeur = m.idConstructeur inner join nature as n on n.idNature = m.idNature inner join image as i on i.idImage = m.idImage
Salut coeur de pirat.
Non, car dans mon exemple, je fais des insert sans existant.Citation:
Envoyé par Coeur de pirat
La question que tu dois te poser est de savoir si tu dois modifier l'existant ou pas ?
Sinon, tu ajoutes le "on duplicate key ...".
--> http://dev.mysql.com/doc/refman/5.7/...duplicate.html
C'est le charset que j'utilise dans mes bases de données. Tu peux mettre utf8 à la place.Code:CHARACTER SET latin1
Chaque champs dans le fichier Excel est séparé par une virgule.Code:FIELDS TERMINATED BY ','
Chaque champs est encadré par des guillemets, même les champs numériques.Code:ENCLOSED BY '"'
C'est le caractère d'échappement.Code:ESCAPED BY '\\' LINES
C'est la fin de la ligne. Pour windows il faut préciser le "carriage return" (x13 ou \r) et le "line feed" (x10 ou \n).Code:TERMINATED BY '\r\n'
Au début du fichier Excel, tu peux avoir des entêtes de colonnes, qui ne te servent à rien.Code:IGNORE 0 LINES
Donc si tu mets "10" alors tu sautes les 10 premières lignes dans ton fichier.
Au lieu de mettre un nom de colonne, je mets simplement une variable positionnelle.Code:(@C1, @C2, @C3, @C4, @C5, @C6, @C7, @C8)
Ainsi en mettant @C1, (ou autre chose commençant par @), j'associe le premier champs du fichier Excel à cette variable.
Je reprends la variable @C1, qui est une chaîne de caractères, et je supprime les blancs avant et après, au cas où cela serait le cas.Code:set nom_constructeur = trim(@C1),
C'est juste un test pour te montrer que l'on peut reconstituer la table "travail" à partir des autres tables, après avoir fait les chargements.Citation:
Envoyé par Coeur de pirat
P.S.: je ne sais pas si ce que j'ai fait correspond à ton cahier des charges, mais vu que je n'ai pas lu ton PDF, il met difficile d'y répondre correctement.
Sinon, le principe est dans l'exemple que je t'ai donné.
@+
Salut Artemus 24
Merci beaucoup pour ta réponse, c'est plus clair !
Effectivement je vais devoir utiliser INSERT ... ON DUPLICATE KEY UPDATE car je devrai pas toucher à la structure de la Base, je vais juste continuer à charger d'autres types d'élémentsCitation:
La question que tu dois te poser est de savoir si tu dois modifier l'existant ou pas ?
Dans mon fichier PDF, j'ai par exemple deux colonnes à fusionner en une seule ('nom' et 'prénom' en une colonne nom-prénom), j'ai aussi un calcul a faire sur une colonne (je retranche un 1 ) et comme je t'ai montré sur le fichier Excel ou y'a une condition.
Par la suite une fois que j'aurai réussi à faire ceci, mon tuteur aimerai bien que je fasse un code dédié pour cette fonctionnalité (charger les données provenant d'Excel) sans avoir à faire des scripts spéciale à chaque fois.
Personnellement, je ne vois pas du tout comment est ce possible, vu qu'on connait pas le cahier de charge, à moins que ça soit les mêmes conditions posés dans le PDF qu'on m'a passé.
Sinon je ne voit pas de standard pour ces choses la !
Crdlt
Salut coeur ce pirat.
Ce que tu fais, normalement, se nomme une interface.
C'est-à-dire que tu vas convertir des données d'un système d'information (Excel), afin de les mettre à disposition dans un autre système d'information (MySql).
Il y a nécessairement des scripts de conversions et de rangements.
C'est un concat() qu'il faut faire.Citation:
Envoyé par Coeur de Pirat
Retranchez 1, c'est facile à faire.Citation:
Envoyé par Coeur de Pirat
La difficulté réside dans la gestion de ton point de reprise, en cas de plantage
Si tu passes deux fois sur les mêmes lignes, ce n'est pas 1 que tu retranches, mais 2.
Tu devras être en mode transaction et gérer correctement les COMMIT.
Mais surtout prévoir un point de reprise, peut être basé sur un identifiant.
Tout dépend si tu as toujours la même structure de ton fichier Excel ou pas.Citation:
Envoyé par Coeur de Pirat
Je ne sais pas répondre à cette question. C'est toi qui possède et a lu le PDF.Citation:
Envoyé par Coeur de Pirat
@+
Bonsoir Aretmus 24,
merci bien pour vos réponses! Je voulais vous poser une autre question qui m'intrigue.
Voila une fois que j'ai créé la table "capteur sonore" et chargé le fichier dedans, je vais faire les requêtes pour remplir mes colonnes au bon endroit, par exemple "non= sonore" dans la colonne "type-champ-metier" de la table "champ".
Ma question , est ce qu'une fois que j'aurai terminé ce travail, je vais garder la table "capteur sonore" dans la Base sachant que je ne devrai pas changer la structure de la base d’après mon tuteur.
Ps:Oui, c'est confirmé,c'est la même structure avec de petits changements mais pas grand chose.Citation:
Tout dépend si tu as toujours la même structure de ton fichier Excel ou pas
Merci de votre aide qui m'est vraiment précieuse, enfaite j'ai mis beaucoup de temps à chercher des travaux déjà existant mais sans succès
Auriez vous une astuce pour optimiser mes recherches ? par exemples des projets déjà fait , des thèses ou des brevets à ce sujet
Salut Coeur de Pirat.
Cette table est une table de travail.Citation:
Envoyé par Coeur de Pirat
Elle n'a pas vocation à rester en permanence dans votre base de données.
Si vous voulez travailler proprement créez une base de données temporaire juste pour créer vos tables de travail.
Après vos chargements, vous pouvez supprimer votre base de données temporaire.
A cherchez où ?Citation:
Envoyé par Coeur de Pirat
Le mieux est soit de faire une recherche dans le forum consacré à MySql ou soit poser des questions !
@+
Ok! Je vais faire comme ça !
Merci bien :)
Bonjour Artemus 24
J'essaye d'exécuter le script complet maintenant que j'ai finit de préparer tout mes insert, mais sans succés !
Il n'accepte pas la syntaxe dés le départ !, il me semble pour exécuter l'ensemble des requêtes il faut faire appel à un programme ! j'a a peu prés 20Code:set autocommit = 0 start transaction
, unCitation:
insert
et unCitation:
load data infile
!Citation:
update
Voici pour rappel l'exemple que vous m'avez envoyer !
Merci de votre aideCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236 -------------- set autocommit = 0 -------------- -------------- start transaction -------------- -------------- DROP DATABASE IF EXISTS `base` -------------- -------------- CREATE DATABASE `base` default character set `latin1` default collate `latin1_general_ci` -------------- -------------- DROP TABLE IF EXISTS `image` -------------- -------------- CREATE TABLE `image` ( `idImage` integer unsigned not null auto_increment primary key, `image` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `nature` -------------- -------------- CREATE TABLE `nature` ( `idNature` integer unsigned not null auto_increment primary key, `nature` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `constructeur` -------------- -------------- CREATE TABLE `constructeur` ( `idConstructeur` integer unsigned not null auto_increment primary key, `nom` varchar(255) not null, `adresse` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `model` -------------- -------------- CREATE TABLE `model` ( `idModel` integer unsigned not null auto_increment primary key, `modelNumber` varchar(255) not null, `idNature` integer unsigned not null, `idImage` integer unsigned not null, `idConstructeur` integer unsigned not null, CONSTRAINT `FK_Nature` FOREIGN KEY (`idNature`) REFERENCES `nature` (`idNature`) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT `FK_Image` FOREIGN KEY (`idImage`) REFERENCES `image` (`idImage`) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT `FK_Constructeur` FOREIGN KEY (`idConstructeur`) REFERENCES `constructeur` (`idConstructeur`) ON DELETE RESTRICT ON UPDATE CASCADE ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `travail` -------------- -------------- CREATE TABLE `travail` ( `id` integer unsigned not null auto_increment primary key, `nom_constructeur` varchar(255) not null, `model_number` varchar(255) not null, `serie` varchar(255) not null, `decoupage` varchar(255) not null, `forme` varchar(255) not null, `type_capteur` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- LOAD DATA LOCAL INFILE 'fichier.txt' INTO TABLE `travail` CHARACTER SET latin1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 0 LINES (@C1, @C2, @C3, @C4, @C5, @C6, @C7, @C8) set nom_constructeur = trim(@C1), model_number = trim(@C2), serie = trim(@C3), decoupage = trim(@C4), forme = trim(@C5), type_capteur = trim(@C6) -------------- -------------- select * from travail -------------- +----+------------------+--------------+-------+-----------+---------------+--------------+ | id | nom_constructeur | model_number | serie | decoupage | forme | type_capteur | +----+------------------+--------------+-------+-----------+---------------+--------------+ | 1 | IBM | Modele 1 | 32 | linéaire | rectangulaire | ang | | 2 | BULL | Modele 75 | 44 | linéaire | rectangulaire | imm | | 3 | IBM | Modele 3 | 32 | linéaire | rectangulaire | ang | | 4 | SUN MACHINE | Modele 12 | 12 | linéaire | rectangulaire | imm | | 5 | IBM | Modele 2 | 25 | linéaire | rectangulaire | ang | | 6 | IBM | Modele 4 | 32 | linéaire | rectangulaire | imm | +----+------------------+--------------+-------+-----------+---------------+--------------+ -------------- insert into constructeur (`nom`,`adresse`) select nom_constructeur as nom, 'bla bla bla' as adresse from travail group by nom_constructeur -------------- -------------- select * from constructeur -------------- +----------------+-------------+-------------+ | idConstructeur | nom | adresse | +----------------+-------------+-------------+ | 1 | BULL | bla bla bla | | 2 | IBM | bla bla bla | | 3 | SUN MACHINE | bla bla bla | +----------------+-------------+-------------+ -------------- insert into `image` (`image`) select forme as image from travail group by forme -------------- -------------- select * from image -------------- +---------+---------------+ | idImage | image | +---------+---------------+ | 1 | rectangulaire | +---------+---------------+ -------------- insert into `nature` (`nature`) select decoupage as nature from travail group by decoupage -------------- -------------- select * from nature -------------- +----------+----------+ | idNature | nature | +----------+----------+ | 1 | linéaire | +----------+----------+ -------------- insert into model (`modelNumber`,`idNature`,`idImage`,`idConstructeur`) select model_number as modelNumber, (select idNature from nature as n where n.nature = t.decoupage) as idNature, (select idImage from image as i where i.image = t.forme) as IdImage, (select idConstructeur from constructeur as c where c.nom = t.nom_constructeur) as IdConstructeur from travail as t group by model_number, 2, 3, 4 -------------- -------------- select * from model -------------- +---------+-------------+----------+---------+----------------+ | idModel | modelNumber | idNature | idImage | idConstructeur | +---------+-------------+----------+---------+----------------+ | 1 | Modele 1 | 1 | 1 | 2 | | 2 | Modele 12 | 1 | 1 | 3 | | 3 | Modele 2 | 1 | 1 | 2 | | 4 | Modele 3 | 1 | 1 | 2 | | 5 | Modele 4 | 1 | 1 | 2 | | 6 | Modele 75 | 1 | 1 | 1 | +---------+-------------+----------+---------+----------------+ -------------- select c.nom as nom_constructeur, m.modelNumber as model_number, n.nature as decoupage, i.image as forme from model as m inner join constructeur as c on c.idConstructeur = m.idConstructeur inner join nature as n on n.idNature = m.idNature inner join image as i on i.idImage = m.idImage -------------- +------------------+--------------+-----------+---------------+ | nom_constructeur | model_number | decoupage | forme | +------------------+--------------+-----------+---------------+ | IBM | Modele 1 | linéaire | rectangulaire | | SUN MACHINE | Modele 12 | linéaire | rectangulaire | | IBM | Modele 2 | linéaire | rectangulaire | | IBM | Modele 3 | linéaire | rectangulaire | | IBM | Modele 4 | linéaire | rectangulaire | | BULL | Modele 75 | linéaire | rectangulaire | +------------------+--------------+-----------+---------------+ -------------- commit -------------- -------------- set autocommit = 1 -------------- Appuyez sur une touche pour continuer...
Salut Coeur de Pirat.
Je travaille en lignes de commandes pour les démonstrations que je vous donne. En premier, j'utilise un script batch windows, afin de lancer le script sql MySql.
Voici le script batch windows :
Vous nommez ce fichier qui est de type text "base.bat".Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 @echo off setlocal enableDelayedExpansion chcp 1252 > nul set PATH=.;%WAMPSERVER%\bin\mysql\%MYSQL%\bin\;%PATH% SET FIC=%~nx0 SET FIC=%FIC:bat=sql% @echo. mysql < %FIC% --verbose --force @echo. pause exit
Dans la variable d'environnement "PATH", vous devez mettre le chemin qui va vers le serveur MySql.
Chez moi, par exemple : F:\Wamp\bin\mysql\mysql5.7.12\bin.
Ensuite, ce que je vous donne est le résultat à l'exécution du script sql et non le script sql par lui-même. Il manque en général les points-virgules.
Voici le script sql :
Vous nommez ce script sql du même nom que le batch windows, ce qui donne : "base.sql".Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209 SET AUTOCOMMIT = 0; START TRANSACTION; -- ====================== -- Base de Données `base` -- ====================== DROP DATABASE IF EXISTS `base`; CREATE DATABASE `base` default character set `latin1` default collate `latin1_general_ci`; use base; -- ============= -- Table `image` -- ============= DROP TABLE IF EXISTS `image`; CREATE TABLE `image` ( `idImage` integer unsigned not null auto_increment primary key, `image` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed; -- ============== -- Table `nature` -- ============== DROP TABLE IF EXISTS `nature`; CREATE TABLE `nature` ( `idNature` integer unsigned not null auto_increment primary key, `nature` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed; -- ==================== -- Table `constructeur` -- ==================== DROP TABLE IF EXISTS `constructeur`; CREATE TABLE `constructeur` ( `idConstructeur` integer unsigned not null auto_increment primary key, `nom` varchar(255) not null, `adresse` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed; -- ============= -- Table `model` -- ============= DROP TABLE IF EXISTS `model`; CREATE TABLE `model` ( `idModel` integer unsigned not null auto_increment primary key, `modelNumber` varchar(255) not null, `idNature` integer unsigned not null, `idImage` integer unsigned not null, `idConstructeur` integer unsigned not null, CONSTRAINT `FK_Nature` FOREIGN KEY (`idNature`) REFERENCES `nature` (`idNature`) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT `FK_Image` FOREIGN KEY (`idImage`) REFERENCES `image` (`idImage`) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT `FK_Constructeur` FOREIGN KEY (`idConstructeur`) REFERENCES `constructeur` (`idConstructeur`) ON DELETE RESTRICT ON UPDATE CASCADE ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed; -- =============== -- Table `travail` -- =============== DROP TABLE IF EXISTS `travail`; CREATE TABLE `travail` ( `id` integer unsigned not null auto_increment primary key, `nom_constructeur` varchar(255) not null, `model_number` varchar(255) not null, `serie` varchar(255) not null, `decoupage` varchar(255) not null, `forme` varchar(255) not null, `type_capteur` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed; -- ======================== -- Chargement fichier Excel -- ======================== LOAD DATA LOCAL INFILE 'fichier.txt' INTO TABLE `travail` CHARACTER SET latin1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 0 LINES (@C1, @C2, @C3, @C4, @C5, @C6, @C7, @C8) set nom_constructeur = trim(@C1), model_number = trim(@C2), serie = trim(@C3), decoupage = trim(@C4), forme = trim(@C5), type_capteur = trim(@C6); -- ====================== -- Vidage table 'travail' -- ====================== select * from travail; -- ================================ -- Remplissage table 'constructeur' -- ================================ insert into `constructeur` (`nom`,`adresse`) select nom_constructeur as nom, 'bla bla bla' as adresse from travail group by nom_constructeur; -- =========================== -- Vidage table 'constructeur' -- =========================== select * from constructeur; -- ========================= -- Remplissage table 'image' -- ========================= insert into `image` (`image`) select forme as image from travail group by forme; -- ==================== -- Vidage table 'image' -- ==================== select * from image; -- ========================== -- Remplissage table 'nature' -- ========================== insert into `nature` (`nature`) select decoupage as nature from travail group by decoupage; -- ===================== -- Vidage table 'nature' -- ===================== select * from nature; -- ========================== -- Remplissage table 'model' -- ========================== insert into `model` (`modelNumber`,`idNature`,`idImage`,`idConstructeur`) select model_number as modelNumber, (select idNature from nature as n where n.nature = t.decoupage) as idNature, (select idImage from image as i where i.image = t.forme) as IdImage, (select idConstructeur from constructeur as c where c.nom = t.nom_constructeur) as IdConstructeur from travail as t group by model_number, 2, 3, 4; -- ==================== -- Vidage table 'model' -- ==================== select * from model; -- ======= -- Requête -- ======= select c.nom as nom_constructeur, m.modelNumber as model_number, n.nature as decoupage, i.image as forme from model as m inner join constructeur as c on c.idConstructeur = m.idConstructeur inner join nature as n on n.idNature = m.idNature inner join image as i on i.idImage = m.idImage; -- === -- Fin -- === commit; set autocommit = 1; exit
A titre indicatif, je vous communique aussi le fichier de nom "fichier.txt" qui a la structure de votre fichier Excel :
A l'exécution, voici ce que cela donne :Code:
1
2
3
4
5
6 "IBM", "Modele 1", 32, "linéaire", "rectangulaire", "ang" "BULL", "Modele 75", 44, "linéaire", "rectangulaire", "imm" "IBM", "Modele 3", 32, "linéaire", "rectangulaire", "ang" "SUN MACHINE", "Modele 12", 12, "linéaire", "rectangulaire", "imm" "IBM", "Modele 2", 25, "linéaire", "rectangulaire", "ang" "IBM", "Modele 4", 32, "linéaire", "rectangulaire", "imm"
Il n'y a aucune difficulté pour lancer un script en lignes de commande.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239 -------------- SET AUTOCOMMIT = 0 -------------- -------------- START TRANSACTION -------------- -------------- DROP DATABASE IF EXISTS `base` -------------- -------------- CREATE DATABASE `base` default character set `latin1` default collate `latin1_general_ci` -------------- -------------- DROP TABLE IF EXISTS `image` -------------- -------------- CREATE TABLE `image` ( `idImage` integer unsigned not null auto_increment primary key, `image` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `nature` -------------- -------------- CREATE TABLE `nature` ( `idNature` integer unsigned not null auto_increment primary key, `nature` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `constructeur` -------------- -------------- CREATE TABLE `constructeur` ( `idConstructeur` integer unsigned not null auto_increment primary key, `nom` varchar(255) not null, `adresse` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `model` -------------- -------------- CREATE TABLE `model` ( `idModel` integer unsigned not null auto_increment primary key, `modelNumber` varchar(255) not null, `idNature` integer unsigned not null, `idImage` integer unsigned not null, `idConstructeur` integer unsigned not null, CONSTRAINT `FK_Nature` FOREIGN KEY (`idNature`) REFERENCES `nature` (`idNature`) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT `FK_Image` FOREIGN KEY (`idImage`) REFERENCES `image` (`idImage`) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT `FK_Constructeur` FOREIGN KEY (`idConstructeur`) REFERENCES `constructeur` (`idConstructeur`) ON DELETE RESTRICT ON UPDATE CASCADE ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- DROP TABLE IF EXISTS `travail` -------------- -------------- CREATE TABLE `travail` ( `id` integer unsigned not null auto_increment primary key, `nom_constructeur` varchar(255) not null, `model_number` varchar(255) not null, `serie` varchar(255) not null, `decoupage` varchar(255) not null, `forme` varchar(255) not null, `type_capteur` varchar(255) not null ) engine=innoDB default charset=latin1 collate=latin1_general_ci row_format=compressed -------------- -------------- LOAD DATA LOCAL INFILE 'fichier.txt' INTO TABLE `travail` CHARACTER SET latin1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 0 LINES (@C1, @C2, @C3, @C4, @C5, @C6, @C7, @C8) set nom_constructeur = trim(@C1), model_number = trim(@C2), serie = trim(@C3), decoupage = trim(@C4), forme = trim(@C5), type_capteur = trim(@C6) -------------- -------------- select * from travail -------------- +----+------------------+--------------+-------+------------+-----------------+--------------+ | id | nom_constructeur | model_number | serie | decoupage | forme | type_capteur | +----+------------------+--------------+-------+------------+-----------------+--------------+ | 1 | IBM | "Modele 1" | 32 | "linéaire" | "rectangulaire" | "ang" | | 2 | BULL | "Modele 75" | 44 | "linéaire" | "rectangulaire" | "imm" | | 3 | IBM | "Modele 3" | 32 | "linéaire" | "rectangulaire" | "ang" | | 4 | SUN MACHINE | "Modele 12" | 12 | "linéaire" | "rectangulaire" | "imm" | | 5 | IBM | "Modele 2" | 25 | "linéaire" | "rectangulaire" | "ang" | | 6 | IBM | "Modele 4" | 32 | "linéaire" | "rectangulaire" | "imm" | +----+------------------+--------------+-------+------------+-----------------+--------------+ -------------- insert into `constructeur` (`nom`,`adresse`) select nom_constructeur as nom, 'bla bla bla' as adresse from travail group by nom_constructeur -------------- -------------- select * from constructeur -------------- +----------------+-------------+-------------+ | idConstructeur | nom | adresse | +----------------+-------------+-------------+ | 1 | BULL | bla bla bla | | 2 | IBM | bla bla bla | | 3 | SUN MACHINE | bla bla bla | +----------------+-------------+-------------+ -------------- insert into `image` (`image`) select forme as image from travail group by forme -------------- -------------- select * from image -------------- +---------+-----------------+ | idImage | image | +---------+-----------------+ | 1 | "rectangulaire" | +---------+-----------------+ -------------- insert into `nature` (`nature`) select decoupage as nature from travail group by decoupage -------------- -------------- select * from nature -------------- +----------+------------+ | idNature | nature | +----------+------------+ | 1 | "linéaire" | +----------+------------+ -------------- insert into `model` (`modelNumber`,`idNature`,`idImage`,`idConstructeur`) select model_number as modelNumber, (select idNature from nature as n where n.nature = t.decoupage) as idNature, (select idImage from image as i where i.image = t.forme) as IdImage, (select idConstructeur from constructeur as c where c.nom = t.nom_constructeur) as IdConstructeur from travail as t group by model_number, 2, 3, 4 -------------- -------------- select * from model -------------- +---------+-------------+----------+---------+----------------+ | idModel | modelNumber | idNature | idImage | idConstructeur | +---------+-------------+----------+---------+----------------+ | 1 | "Modele 1" | 1 | 1 | 2 | | 2 | "Modele 12" | 1 | 1 | 3 | | 3 | "Modele 2" | 1 | 1 | 2 | | 4 | "Modele 3" | 1 | 1 | 2 | | 5 | "Modele 4" | 1 | 1 | 2 | | 6 | "Modele 75" | 1 | 1 | 1 | +---------+-------------+----------+---------+----------------+ -------------- select c.nom as nom_constructeur, m.modelNumber as model_number, n.nature as decoupage, i.image as forme from model as m inner join constructeur as c on c.idConstructeur = m.idConstructeur inner join nature as n on n.idNature = m.idNature inner join image as i on i.idImage = m.idImage -------------- +------------------+--------------+------------+-----------------+ | nom_constructeur | model_number | decoupage | forme | +------------------+--------------+------------+-----------------+ | IBM | "Modele 1" | "linéaire" | "rectangulaire" | | SUN MACHINE | "Modele 12" | "linéaire" | "rectangulaire" | | IBM | "Modele 2" | "linéaire" | "rectangulaire" | | IBM | "Modele 3" | "linéaire" | "rectangulaire" | | IBM | "Modele 4" | "linéaire" | "rectangulaire" | | BULL | "Modele 75" | "linéaire" | "rectangulaire" | +------------------+--------------+------------+-----------------+ -------------- commit -------------- -------------- set autocommit = 1 -------------- Appuyez sur une touche pour continuer...
@+
Bonjour Artemus 24
Merci beaucoup pour vos réponse, je viens d'apprendre le script batch grace à vous !
Donc si je comprends bien , je vais créer un fichier.sql avec toutes les requêtes à exécuter et un autre .bat que je vais exécuter et ça devrait marcher !
mes questions ?
Dans mon script SQL , devrais-je recréer ma base de données ainsi que mes tables comme dans votre script ou alors mes insert, mon update et le load data infile suffit ?
dans le script batch, la commande suivanteest ce qu'elle sert à forcer l'exécution du script malgré une présence d'erreurs dans le code ?Code:mysql < %FIC%
Merci de m'éclairer ces points !
Cordialement.
Salut Cœur de Pirat.
Quand on est débutant, c'est bien de savoir se servir de PhpMyAdmin.Citation:
Envoyé par Coeur de Pirat
Mais celui-ci reste fastidieux dans les manipulations à faire.
En dehors de PhpMyAdmin, le débutant programme directement en php.
Il ne passe pas par des scripts en ligne de commande pour tester ses requête, avant de les programmer.
C'est dommage car s'est très utile, d'autant que le script peut être conservé à l'inverse des manipulations sous PhpMyAdmin.
Les deux font la pair.Citation:
Envoyé par Coeur de Pirat
Le script batch sert à lancer l'exécution de MySql en ligne de commande.
Le script sql va contenir toutes vos requêtes que vous désirez tester.
Dans mes exemples, je crée ce dont j'ai besoin afin de montrer comment résoudre le problème.Citation:
Envoyé par Coeur de Pirat
Dans votre contexte, si la base de données existe déjà, et bien vous n'allez pas la recréer.
Tout ce que vous devez faire, c'est mettre ceci :
C'est-à-dire définir le lien vers votre base de données existante.Code:use {le nom de votre base de données};
"mysql est ce qui va exécuter votre script sql.Citation:
Envoyé par Coeur de Pirat
Le "<" signifie que vous faites une redirection, c'est-à-dire que votre script sera lu en ligne de commande.
Je vous conseille de laisser les paramètres verbose pour avoir un compte-rendu visible de l'exécution et force pour ne pas vous arrêter à la première erreurCode:mysql < %FIC% --verbose --force
@+
bonsoir Artemus 24
Merci pour toutes ces précisions !
J'ai quand meme d'autres questions , j'ai cherché mais j'ai pas trouvé la réponse !
Les deux commandes suivantes , que signifient elles exactement ?
Dans ce script quel ligne dit qu'il faut exécuter le script Sql? et est ce qu'il y'a une information sur le fichier Excel que je vais importerCitation:
SET FIC=%~nx0
SET FIC=%FIC:bat=sql%
Remarque : est ce qu'il serai pas mieux de le faire en script PHP car les lignes de commandes je n'y travaille jamais avec ? c'est tout nouveau pour moi !
Merci bien :)
Voici un exemple d'utilisation de PHP que j'ai trouvé sur le forum php !
https://www.daniweb.com/programming/...ollback-in-php
Salut Coeur de pirat.
La première commande sert à récupérer le nom du batch.Citation:
Envoyé par Coeur de Pirat
Si le script batch windows que tu lances se nomme "base.bat", et bien il va récupérer "base.bat".
La seconde commande va remplacer le ".bat" par le ".sql".
Ce qui implique que le script doit porter le même nom que le script batch sql.
C'est cette ligne qui exécute le script sql :Citation:
Envoyé par Coeur de Pirat
Dans la variable "%FIC%", il y a le nom du script sql.Code:mysql < %FIC% --verbose --force
Dans mon exemple de ci-dessus, il s'agit du nom "base.sql".
Le fichier Excel que tu dois importer est déclaré dans le script sql.Citation:
Envoyé par Coeur de Pirat
Il n'y a aucune information concernant ce fichier Excel dans le script batch windows.
Ca dépend de ce que tu fais avec.Citation:
Envoyé par Coeur de Pirat
Si c'est à la demande, ou si tu fais du bidouillage, un script en ligne de commande est très utile.
Inversement, si tu veux automatiser le traitement, tout dépend de ce que tu désires faire aussi.
L'exemple du lien que tu donnes sert uniquement à faire des requêtes : "mysql_query". Et en plus, ton exemple est obsolète !
Je pense que pour l'instant, essaye de mettre au point tes script sql, avant de penser à les automatiser.
Dans ces scripts, il y a des créations de tables de travail, des chargements depuis un fichier Excel et des traitements de dispatching des données dans les tables existentes.
Si tu veux vraiment les encapsuler dans du php, il faudra t'investir dans le php et en particulier dans le pdo mysql qui est plus moderne que le php mysql : http://php.net/manual/fr/ref.pdo-mysql.php
Pour le php, même dans le cadre de mysql, il vaut mieux s'adresser au forum php.
@+
Salut artemus 24,
merci beaucoup pour tes réponses précieuses!
Ok donc je continue avec le script batch pour le moment, enfaite ce que je fais c'est un import d'un fichier Excel dans la base de données, comme vous me l'avez indiqué depuis le début de la discussion ! J'ai procédé colonne par colonne pour réaliser mes requêtes car ya des insert pour insérer les données dans le bon endroit , maintenant il va falloir regrouper toutes les requêtes dans un seul script !
voila le script batch :
et ci dessous le code sql avec un exemple de deux requêtes car le fichier est très lent !Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 @echo off setlocal enableDelayedExpansion chcp 1252 > nul set PATH="C:\Program Files\MySQL\MySQL Workbench 6.3 CE";%PATH% SET FIC=%~nx0 SET FIC=%FIC:bat=sql% echo FIC=%FIC% mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < %FIC% --force pause
QUESTIONS:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 set autocommit = 0; start transaction; use base_configuration_test; LOAD DATA LOCAL INFILE 'C:\\programmes\\capteurs.csv' INTO TABLE base_configuration_test.trad_M2M CHARACTER SET utf8 FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 0 LINES (A1,A2,@C3,@C4,@C5,@C6,@C7,@C8,@C9,B,@C11,@C12,@C13) set P = trim(@C3), f = replace(@C4, ',', '.'), l= replace(@C5, ',', '.'), H = trim(@C6), lenght = replace(@C7, ',', '.'), Radius= replace(@C8,',','.'), frequency = replace(@C9,',','.'), Element = replace(@C11,',','.'), Elementquantity = trim(@C12), M_Capteur = trim(@C13) -- commit INSERT INTO `base_configuration_test`.`model` (model_number,id_image,id_nature,id_constructeur) SELECT CONCAT(P,'-', A2) as model_number , null as id_image, 2 as id_nature, 236 as id_constructeur from `base_configuration_test`.`trad_olympus` INSERT INTO base_configuration_test.materiel (serie, fichier,id_model) SELECT DISTINCT '00000' as serie , NULL as fichier , m.id_model as id_model FROM base_configuration_test.model m order by m.id_model commit; set autocommit = 1;
Au niveau des 3 premières lignes ainsi que les dernières , et entre les requêtes y'a rien à mettre pour séparer dans le script sql?
Merci de votre réponse !
l’exécution du script batch me donne des erreurs et pourtant j'ai testé toutes les requêtes une à une pour s'assurer qu'il n’y a pas d'erreurs
Pièce jointe 210803
Merci bien
Bonne soirée :)
Salut Cœur de Pirat.
Le script batch windows est toujours le même. Donc il ne change pas dans son contenu.
Admettons que votre fichier Excel vient à charger une seule table. Et vous avez plusieurs Excel à traiter.Citation:
Envoyé par Cœur de Pirat
Qu'est-ce qui vous empêche de lancer vos exécutions en parallèle ?
Il n'y aura aucun télescopage car chaque fichier Excel vient travailler avec sa table.
Admettons que maintenant, vos fichiers Excel viennent à travailler avec plusieurs tables, ce qui est le cas, je crois.
Dans ce cas là, il faut introduire la notion de "transaction" dans vos traitements.
C'est ce que l'on trouve dans les scripts :
Voir la documentation MySql à ce sujet : http://dev.mysql.com/doc/refman/5.7/en/commit.htmlCode:
1
2
3
4
5 set autocommit = 0; start transaction; ... Commit; set autocommit = 1;
Plus le fichier Excel est gros et plus le temps du chargement sera long.
Il vaut mieux faire plusieurs petits fichiers Excel et les lancer un par un, que d'en faire un seul énorme.
Vous pouvez toujours mettre des commentaires :Citation:
Envoyé par Cœur de Pirat
Il y a aussi une chose que vous pouvez faire, au lieu d'un énorme script SQL.Code:
1
2
3 -- ===================== -- Création Table 'Test' -- =====================
Soit vous créez un script sql chapeau contenant par exemple :
Ou bien, vous dupliquez la ligne "mysql" dans le script batch windows :Code:
1
2
3
4
5 source prog_1.sql source prog_2.sql source prog_3.sql source prog_4.sql source prog_5.sql
@+Code:
1
2
3
4
5
6
7
8
9
10
11
12 @echo off chcp 1252 > nul set PATH="C:\Program Files\MySQL\MySQL Workbench 6.3 CE";%PATH% mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < prog_1.sql --force > log_1.txt mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < prog_2.sql --force > log_2.txt mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < prog_3.sql --force > log_3.txt mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < prog_4.sql --force > log_4.txt mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < prog_5.sql --force > log_5.txt pause
Salut Artemus et merci encore
En dirai que vous savez ou je vais ! pour l'instant je n'ai qu'un seul fichier excel à gérer dans mes tables mais par la suite j'aurai d'autres , justement je reviendrai vers cette problématique par la suite, pour pas que les nouveaux fichiers Excel viennent écraser les informations du premier fichier excel , il faudra que je réfléchissent à ça !
Revenons à notre script ? donc pourquoi ça ne marche pas ! avez vous regarder l'erreur qu'il m'affiche ? erreur de syntaxe à la ligne Load data ...
est ce que leest ici juste pour activer la transaction ou bien on peut se passer et juste se contenter de mettreCitation:
set autocommit
la même chose pourCitation:
start transaction
, c'est pour dire que c'est la fin de la transaction c'est bien ça ?Citation:
set autocmmit = 1
Merci pour votre réponse
Cordialement.
Salut Coeur de Pirat.
Avez-vous lu le lien que je vous ai donné ?
Ceci permet de désactiver l'autocommit implicite.Code:set autocommit = 0;
Autrement dit, en mettant zéro, c'est à vous de gérer les validations (commit) ou les rejets (rollback).
C'est le début du mode transactionnel.Code:start transaction;
A partir de maintenant vous journalisez toutes vos insertions, ou modifications ou suppressions.
C'est la validation de ce qui a été journalisée.Code:Commit;
C'est le rejet de ce qui a été journalisée.Code:Rollback;
On repasse dans le mode autocommit implicite.Code:set autocommit = 1;
@+
Bonjour Artemus 24,
Merci pour votre réponse , toujours trés claire !
Mon script batch fonctionne très bien avec ma base de données vide , cependant je travaille avec des données déjà enregistrés et je suis confronté à un problème de jointure
J'ai 3 table (Model, materiel et valeurs_champs_materiels)
pour mes inserts voici les scripts :
Pour inserer des données dans ma table model :
la table materiel :Code:
1
2
3
4
5
6 INSERT INTO `base_configuration`.`model` (model_number,id_image,id_nature,id_manufacturer) SELECT CONCAT(Probe,'-', Housing) as model_number , null as id_image, 2 as id_nature, 4 as id_manufacturer from `base_configuration`.`traducteur_IBM`;
table valeurs_champs_materiels :Code:
1
2
3
4
5
6
7 INSERT INTO `base_configuration`.`materiel` (serie, fichier,id_model) SELECT DISTINCT '00000' as serie , NULL as fichier , m.id_model as id_model FROM `base_configuration`.`model` m where m.id_model between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
Jusqu'ici tout se passe bien , j'ai bien les bons ID_materiel dans ma table valeurs_champs_materielsCode:
1
2
3
4
5
6
7
8
9
10
11
12
13 INSERT INTO `base_configuration`.`valeurs_champs_materiels` ( id_materiel , valeur_string , id_champ , id_type_data ) SELECT DISTINCT id_materiel AS id_materiel , 'capteur_mono' AS valeur_string , 4 AS id_champ , 10 AS id_type_data FROM base_configuration.materiel l where l.id_materiel between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
Cependant, quand je fais cette requête pour inserer d'autres données dans la même table avec condition (prendre les mêmes id_materiel insérés précédemment , cela ne m'affiche rien)
Voici la requête en question :
Cela me donne 0 lignes mais ne mentionne aucune erreur !Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 INSERT INTO `base_configuration`.`valeurs_champs_materiels` ( id_materiel , id_champ , valeur_string , id_type_data ) SELECT DISTINCT l.id_materiel AS id_materiel , 12 AS id_champ , if (t.element= 'A1','Transducer.multi', 'Transducer.mono') as valeur_string , 10 AS id_type_data FROM base_configuration.traducteur_IBM t inner join base_configuration.model m on CONCAT(probe,'-', housing)= m.model_number inner join base_configuration.materiel l on l.id_model= m.id_model where l.id_materiel between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
Ma question: devrais-je faire une autre jointure en prenant en compte cette même table valeurs_champs_materiels et faire quelque chose qui ressemble à ça :
Merci pour votre aideCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 INSERT INTO `base_configuration`.`valeurs_champs_materiels` ( id_materiel , id_champ , valeur_string , id_type_data ) SELECT DISTINCT l.id_materiel AS id_materiel , 12 AS id_champ , if (t.element= 'A1','Transducer.multi', 'Transducer.mono') as valeur_string , 10 AS id_type_data FROM base_configuration.traducteur_IBM t inner join base_configuration.model m on CONCAT(probe,'-', housing)= m.model_number inner join base_configuration.materiel l on l.id_model= m.id_model inner join base_configuration.valeurs_champs_materiels v ON v.id_valeurs_champs_materiel = v.id_materiel where l.id_materiel between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT())
Cordialement.
Bonjour,
Si vous n'insérez aucune ligne et qu'il n'y a pas de message d'erreur, c'est que votre requête select imbriquée ne trouve aucune ligne, vérifiez le simplement en exécutant cette requête seule.
Vous utilisez des fonctions de colonne pour alimenter ce qui ressemble à des identifants (a priori non primaires) dans vos tables , ex : CONCAT(Probe,'-', Housing) as model_number-
Si ces colonnes sont indexées, alors votre requête n'est pas "sargable" ca signifie que vos index ne seront éligibles ni pour vos jointures, ni pour vos filtres, avec pour conséquence des performances potentiellement désastreuses selon le volume d'information à traiter.
Il aurait été préférable d'avoir 2 colonnes distinctes pour chaque partie constitutive de votre "model number"
Je vous avoue que je ne comprends pas trop ce que vous m'expliquer ! le model number c'est une concatenation de deux colonnes que j'ai cherché de la table traducteur_IBM ! c'est une exigence de mes inserts ! je vais chercher autour de ce que vous me dites , peut être que c'est ça l'erreur !
Entre temps j'ai fait un update juste derrière mon insert comme ceci :
il me sélectionne pas les lignes entières , il me donne une erreur 1175 : Vous utilisez le mode de mise à jour en toute sécurité et vous avez essayé de mettre à jour une table sans WHERE qui utilise une colonne KEY Pour désactiver le mode sans échec , basculer l'option dans les Préférences - > Editeur de SQL et rebrancher.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 NSERT INTO `base_configuration`.`valeurs_champs_materiels` ( id_materiel , id_champ , valeur_string , id_type_data )SELECT DISTINCT l.id_materiel AS id_materiel , 12 AS id_champ , if (t.ProbeType= 'A1','Transducer.mono', 'Transducer.multi') as valeur_string , 10 AS id_type_data FROM base_configuration.traducteur_IBM t inner join base_configuration.model m on CONCAT(probe,'-', housing)= m.model_number inner join base_configuration.materiel l on l.id_model= m.id_model where l.id_materiel between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT()); update valeurs_champs_materiels v inner join base_configuration.materiel l on l.id_materiel= v.id_materiel set l.id_materiel= last_insert_id() and (LAST_INSERT_ID() + ROW_COUNT())
Merci de votre réponse !
Salut Coeur de Pirat.
Plusieurs conseils à te donner :
1) essayes de faire simple, sinon gare à la maintenance !!!
2) tu as un problème de périmètre (j'espère que tu comprends ce terme).
Le mieux pour résoudre ce problème est de passer par une table temporaire.
Ainsi tu travailles sur un sous-ensemble et non sur la totalité de la table.
3) dans la table temporaire, fais la mise en forme dont tu as besoin avant de faire ton insertion.
Cela va te simplifier grandement le travail que tu dois faire.
4) tu as trouvé une astuce qui me parrait inutile, mais surtout compliquée à souhait.
C'est le where m.id_model between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());.
D'ailleurs, tu l'utilises dans tes insert alors qu'en travaillant sur les tables temporaires, tu n'as plus besoin de cette astuce.
Voici un exemple qui permet de faire l'insert définitif, sans avoir de problèmes à gérer.
Il y a deux tables :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 -------------- SET AUTOCOMMIT = 0 -------------- -------------- START TRANSACTION -------------- -------------- DROP DATABASE IF EXISTS `base` -------------- -------------- CREATE DATABASE `base` DEFAULT CHARACTER SET `latin1` DEFAULT COLLATE `latin1_general_ci` -------------- -------------- DROP TABLE IF EXISTS `temp` -------------- -------------- CREATE TABLE `temp` ( `clef` integer unsigned auto_increment NOT NULL primary key, `lib` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci` ROW_FORMAT=COMPRESSED -------------- -------------- DROP TABLE IF EXISTS `test` -------------- -------------- CREATE TABLE `test` ( `id` integer unsigned NOT NULL AUTO_INCREMENT primary key, `val` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci` ROW_FORMAT=COMPRESSED -------------- -------------- INSERT INTO `test` (`val`) values ('un'), ('deux'), ('trois'), ('quatre'), ('cinq') -------------- -------------- select * from test -------------- +----+--------+ | id | val | +----+--------+ | 1 | un | | 2 | deux | | 3 | trois | | 4 | quatre | | 5 | cinq | +----+--------+ -------------- set @rang:=0 -------------- -------------- SELECT AUTO_INCREMENT into @rang FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'base' and table_name = 'test' -------------- -------------- select @rang -------------- +-------+ | @rang | +-------+ | 6 | +-------+ -------------- set @var = concat('alter table `temp` auto_increment = ', @rang) -------------- -------------- PREPARE stmt FROM @var -------------- -------------- EXECUTE stmt -------------- -------------- DEALLOCATE PREPARE stmt -------------- -------------- INSERT INTO `temp` (`lib`) values ('dix'), ('onze'), ('douze'), ('treize'), ('quatorze'), ('quinze'), ('seize') -------------- -------------- select * from temp -------------- +------+----------+ | clef | lib | +------+----------+ | 6 | dix | | 7 | onze | | 8 | douze | | 9 | treize | | 10 | quatorze | | 11 | quinze | | 12 | seize | +------+----------+ -------------- insert into `test` (`id`,`val`) select clef as id, lib as val from `temp` -------------- -------------- select * from test -------------- +----+----------+ | id | val | +----+----------+ | 1 | un | | 2 | deux | | 3 | trois | | 4 | quatre | | 5 | cinq | | 6 | dix | | 7 | onze | | 8 | douze | | 9 | treize | | 10 | quatorze | | 11 | quinze | | 12 | seize | +----+----------+ -------------- COMMIT -------------- -------------- SET AUTOCOMMIT = 1 -------------- Appuyez sur une touche pour continuer...
--> 'test', celle que tu dois charger avec un jeu d'essai.
--> 'temp', la table de travail dont tu dois mettre en forme.
a) dans la table 'test', il y a déjà un jeu d'essai, soit cinq lignes.
tu désires récupérer la dernière valeur de l'auto incrément afin de l'appliquer à la table 'temp'.
Bien sûr, la table 'temp' est vide puisque c'est une table de travail.
b) tu extrais la valeur de l'auto incrément de la table 'test', qui comme tu le constates est la dernière valeur de la colonne 'id' +1.
c) tu appliques cette nouvelle valeur de l'auto incrément à la table 'temp'.
d) tu insères les nouvelles lignes dans la table 'temp'.
En ce point de ton travailles, la table 'temp' a été mis en forme pour la suite de ce que tu dois faire.
Je ne parle pas que de l'insert, mais aussi des cascades que tu dois faites par la suite comme dans tes exemples.
e) tu disposes tout ce dont tu as besoin, entre autre un identifiant 'clef' qui possède les prochaines valeurs à insérer dans la table 'test'.
J'espère que quand tu vas lancer ce script, tu es seule à le faire !!!
f) tu insères les nouvelles lignes de 'temp' dans la table 'test' sans aucun problème, comme tu peux le constater.
g) je m'arrête là, mais j'espère que tu as compris comment tu dois procéder pour faire en cascade les différents chargement de test tables.
Il suffit de faire une jointure sur la table 'temp' et c'est tout !
Du coup, tu n'as plus aucun problème pour trouver les identifiants dont tu as besoin.
h) plus tu simplifies le travail dès le départ et mon tu vas rencontrer des problèmes par la suite !
@+
Bonjour Artemus 24,
je suis confronté à un problème de requête, je n'arrive pas à associer pour chaque modéle une image !
voici mes deux tables ainsi que ma table de travail :
table de travail:
import du fichier Excel:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 CREATE TABLE IF NOT EXISTS base.trad( base.trad.id INT(11) NOT NULL AUTO_INCREMENT, base.trad.name VARCHAR(45) NULL DEFAULT NULL, base.trad.Model_Number VARCHAR(45) NULL DEFAULT NULL, base.trad.Serial_Number VARCHAR(45) NULL DEFAULT NULL, base.trad.Pattern VARCHAR(45) NULL DEFAULT NULL, base.trad.Type VARCHAR(45) NULL DEFAULT NULL, base.trad.Element VARCHAR(45) NULL DEFAULT NULL, base.trad.NumberofElementsTotal VARCHAR(45) NULL DEFAULT NULL, base.trad.NumberofElementsDimB VARCHAR(45) NULL DEFAULT NULL, base.trad.ElementDimB VARCHAR(45) NULL DEFAULT NULL, base.trad.ElementDimA DOUBLE NULL DEFAULT NULL, base.trad.ElementPitchA VARCHAR(45) NULL DEFAULT NULL, base.trad.ElementPitchB VARCHAR(45) NULL DEFAULT NULL, base.trad.Element_position VARCHAR(45) NULL DEFAULT NULL, base.trad.surface VARCHAR(45) NULL DEFAULT NULL, base.trad.surface_type VARCHAR(45) NULL DEFAULT NULL, base.trad.surfaceparameters VARCHAR(45) NULL DEFAULT NULL, base.trad.Nominal_Frequency VARCHAR(45) NULL DEFAULT NULL, base.trad.Picture BLOB NULL DEFAULT NULL, base.trad.Description VARCHAR(45) NULL DEFAULT NULL, base.trad.capteur_inclut VARCHAR(45) NULL DEFAULT NULL, PRIMARY KEY (id)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;
insertion d'une image dans la table image :Code:
1
2
3
4
5
6
7
8 LOAD DATA LOCAL INFILE 'C:\\Stage\\Essai.csv' INTO TABLE base.trad CHARACTER SET utf8 FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;
la table model :Code:
1
2
3
4 insert into base.image(image, nom_image) select t.picture as image, 'B2M' as nom_image from base.trad t;
Résultat :Code:
1
2
3
4
5
6
7
8
9
10
11 insert into base.model(model_number, description, id_nature,id_manufacturer, id_image) select distinct t.Model_number as model_number, t.description as description, (select id_nature from base.nature where id_nature= 2) as id_nature, (select id_manufacturer from base.manufacturer where name= 'B2M') as id_manufacturer, (select id_image from base.image where nom_image='B2M' ) as id_image from base.trad t inner join base_configuration.image i ON i.image = t.picture where i.id_image between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
Il m'affiche pour chaque model, il m'associe tout les id_image or moi je veux pour chaque model un id_image !
Merci de votre aide
cordialement,
Salut Coeur de Pirat.
Tu fais n'importe quoi ! Et en plus, tu t'y prends très mal.
J'ai surtout l'impression que tu ne sais pas comment répartir les données issues du fichier Excel vers tes tables MySql.
Il n'y a aucun reflexion sur le passage du fichier Excel vers tes tables MySql.
Si tu éclates un fichier en plusieurs tables, tu dois conserver sous une forme ou une autre, le lien qui existe entre ces données.
Sinon comment associer par exemple une image venant de ta table trad, vers la table modèle ?
Ce n'est pas du simple recopiage de masse que tu dois faire, mais bien créer des liens.
Si la première chose à faire est de charger le fichier Excel dans une table de travail, ça tu sais le faire.
Faire l'éclatement des lignes vers des tables, ne se fait pas en faisant que du recopiage.
Si tu procédes ainsi, tu as une perte d'informations qui est celle du lien entre tes données.
Ce lien se fait par la clef primaire de ta table, mais aussi par les clefs étrangères que tu dois aussi gérer dans les autres tables.
1) tu remplies la table image en mettant toujours le même nom. Comment veux-tu distinguer une image d'une autre ?
Je ne voie pas, dans la table image, le descriptif de cette image ?
Pourtant, tu as cette colonne dans la table trad. Alors pourquoi ne pas la reconduire ?
Et quel est l'identifiant de cette image ?
Ce n'est pas par le nom de l'image que tu dois faire le lien, mais par son identifiant.
2) dans le dernier insert, il faut créer des jointures entre toutes tes tables.
Tu as créé une jointure avec la table base_configuration. Et pourquoi ne pas le faire avec les autres tables ?
Et c'est quoi le problème ? Tu ne sais pas faire le lien entre toutes ces tables.
C'est le coeur même de ce que l'on te demande de faire.
3) c'est quoi ça ?
Pourquoi le faire ainsi et non dans le cadre d'une jointure ?Code:select id_nature from base.nature where id_nature= 2) as id_nature,
Pourquoi mettre toujours id_nature à 2 ?
Si la colonne id_nature est ta clef primaire, comment la gères-tu ?
Et comment vas-tu faire le lien entre la table trad ?
4) même remarque.
Faire une jointure !Code:(select id_manufacturer from base.manufacturer where name= 'B2M') as id_manufacturer,
Donc tu as qu'une seule image dans toutes ta base de données. Est-ce bien cela ?
5) encore et toujours les mêmes remarques.
Une seule image ?????Code:(select id_image from base.image where nom_image='B2M' ) as id_image
6) je t'ai montré comment faire et tu reviens avec cette merde ! 8O
Désolé mais ce n'est pas à moi de faire ton projet.Code:where i.id_image between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
Je t'ai aidée sur des questions techniques, et je m'arrête là.
@+
Oullaa doucement Artemus !
C'est bien gentil de m'aider mais la j'avoue que tu me surprend!
Certes je me suis mal exprimé et j'ai fait quelques erreurs das le code en le recopiant dans le forum !
1) Je n'ai qu'une seule image par défault dans mon fichier excel et donc j'ai rempli la table image normalement depuis la table trad .
2) La base_configuration est une erreur de ma part, je voulais dire base.image, j'ai fait le lien entre la table trad et la table image et le seul lien qui existe c'est bien la colonne picture et la colonne image.
3) ceci est une erreur en recopiant le code !, je récupere l'id donc je mets where nature = 'Traducteur'.Citation:
select id_nature from base.nature where id_nature= 2
4) Meme chose pour cette requete :, ici je récupére l'id manufacturer.Citation:
select id_manufacturer from base.manufacturer where name= 'B2M') as id_manufacturer,
Oui c'est ça j'ai qu'une seule image que j'applique pour toutes les lignes (Tout les model_number).
5) Merci bien pour toute l'aide que tu m'as porté mais la ce n'est pas une merde !!!!!
Je lui dit de prendre en compte tout les derniers id_image que je venais d'insérer .Citation:
where i.id_image between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
effectivement j'ai mal recopier mes scripts et je m'en excuse , c'était totalement mélangé dans ma tête!!
voila le bon code :
En tout as merci quand même du temps que t'as pris pour lire et donner des remarques !Code:
1
2
3
4
5
6
7
8
9
10
11 insert into base.model(model_number, description, id_nature,id_manufacturer, id_image) select distinct t.Model_number as model_number, t.description as description, (select id_nature from base.nature where nature= 'transducer') as id_nature, (select id_manufacturer from base.manufacturer where name= 'B2M') as id_manufacturer, i.id_image as id_image from base.trad t inner join base_configuration.image i ON i.image = t.picture where i.id_image between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT())
Je ne veux qu'apprendre et je ne compte pas demander à quiconque de me faire mon travail ! j'étais vraiment bloqué depuis quelques jours autrement je ne ferai pas appel à vous!!!