Voici un exemple d'utilisation de PHP que j'ai trouvé sur le forum php !
https://www.daniweb.com/programming/...ollback-in-php
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.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 :Envoyé par Coeur de Pirat
Dans la variable "%FIC%", il y a le nom du script sql.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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.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.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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.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.html
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :Envoyé par Cœur de Pirat
Il y a aussi une chose que vous pouvez faire, au lieu d'un énorme script SQL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 mettreset autocommitla même chose pourstart transaction, c'est pour dire que c'est la fin de la transaction c'est bien ça ?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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part Commit;
C'est le rejet de ce qui a été journalisée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Rollback;
On repasse dans le mode autocommit implicite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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_materiels
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part (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 : Sélectionner tout - Visualiser dans une fenêtre à part (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 !
Désolé mais ce n'est pas à moi de faire ton projet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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'.select id_nature from base.nature where id_nature= 2
4) Meme chose pour cette requete :, ici je récupére l'id manufacturer.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 .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 : Sélectionner tout - Visualiser dans une fenêtre à part
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!!!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager