bonjour,
j'ai rencontré un comportement étrange de ma BD et après quelques tests j'ai trouvé la solution, sauf que je n'ai compris ni l'origine du problème ni le pourquoi de la solution donc si quelqu'un peut éclairer ma lanterne...
en MySQL 5, moteur InnoDB, voilà le script correspondant à la table en question, en ne gardant que le code pertinent :
donc en gros, une PK, 3 FK avec chacune un index et 2 index unique dont un portant sur 3 colonnes
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 CREATE TABLE `fxc_pages` ( `page_id` int(11) unsigned NOT NULL auto_increment, `page_code` varchar(255) collate latin1_general_ci NOT NULL, `site_id` int(11) unsigned NOT NULL, `template_id` int(11) unsigned NOT NULL, `parent_id` int(11) unsigned default NULL, `page_order` int(11) unsigned NOT NULL default '0', PRIMARY KEY (`page_id`), UNIQUE KEY `page_code` (`page_code`,`site_id`), UNIQUE KEY `page_order` (`site_id`,`parent_id`,`page_order`), KEY `parent_id` (`parent_id`), KEY `template_id` (`template_id`), KEY `site_id` (`site_id`), CONSTRAINT `fxc_pages_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `fxc_pages` (`page_id`) ON DELETE CASCADE, CONSTRAINT `fxc_pages_site_id` FOREIGN KEY (`site_id`) REFERENCES `fxc_sites` (`site_id`) ON DELETE CASCADE, CONSTRAINT `fxc_pages_template_id` FOREIGN KEY (`template_id`) REFERENCES `fxc_templates` (`template_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
avec cette structure, une requête comme celle là, le order by n'était pas pris en compte
pour régler le problème, il a suffit de virer la clé sur site_id :
Code : Sélectionner tout - Visualiser dans une fenêtre à part update fxc_pages set page_order = page_order - 1 where site_id = x and parent_id = y and page_order <= z and page_order > t order by page_order asc
je ne suis pas un pro MySQL et je connais les détails de sa gestion des index et des clés donc si quelqu'un sait...
Code : Sélectionner tout - Visualiser dans une fenêtre à part KEY `site_id` (`site_id`),
merci d'avance
Partager