J'utilise pour traduire mon site web un dictionnaire stocké actuellement sur une table dont voici la structure :
Le champs IDPage désigne la page web où se trouve le mot du dico. Sa présence dans la table dico pose un problème car il y a maintenant plus de 3000 mots dont beaucoup de doublons.
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 -- -- Structure de la table `dico` -- CREATE TABLE `dico` ( `id` int(10) unsigned NOT NULL auto_increment, `IDPage` varchar(32) NOT NULL default '', `FR` text NOT NULL, `EN` text NOT NULL, `DE` text NOT NULL, `SP` text NOT NULL, `IT` text NOT NULL, PRIMARY KEY (`id`), KEY `IDPage` (`IDPage`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
Pour y remédier j'ai créé 2 nouvelles tables et une procédure pour les remplir correctement.
Voici la procédure telle qu'elle est écrite dans MySQL Admin :
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 -- -- Structure de la table `page` -- CREATE TABLE `page` ( `id_page` varchar(32) collate latin1_bin NOT NULL, `adresse` varchar(64) collate latin1_bin default NULL, `nom` varchar(32) collate latin1_bin default NULL, PRIMARY KEY (`id_page`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin; -- -- Structure de la table `relation_dico_page` -- CREATE TABLE `relation_dico_page` ( `id_dico` int(10) NOT NULL, `id_page` varchar(32) collate latin1_bin NOT NULL, PRIMARY KEY (`id_dico`,`id_page`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
Mon problème : la procédure n'affecte aucune ligne, les insertions ne marchent pas et il n'y a pas d'erreurs dans le log de mysql.
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 CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_id_page`() BEGIN DECLARE done INT DEFAULT 0; DECLARE idpage VARCHAR(32); DECLARE iddico INT(10); DECLARE curseur CURSOR FOR SELECT `id`,`IDPage` FROM `dico` ; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET done = 0; OPEN curseur; REPEAT FETCH curseur INTO iddico, idpage; IF ! done THEN INSERT INTO `page` (`id_page` ,`adresse` ,`nom`) VALUES (idpage, '',idpage); INSERT INTO `relation_dico_page` (`id_dico` ,`id_page`) VALUES (`iddico`,`idpage`); END IF; UNTIL done END REPEAT; CLOSE curseur; END
d'avance pour vos réponses
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 mysql> CALL insert_id_page; Query OK, 0 rows affected (0.09 sec)
P.S. C'est la première fois que je fait une procédure sous MySQL alors s'il vous plais ne soyez pas trop méchants si la solution est simple et évidente.
Partager