Bonjour à tous,
je développe une BD sous MySQL 5.0.22 en InnoDB et ya deux trucs que je ne comprends pas :
Voici le contexte :
- J'ai une table 'thème' qui gère des thèmes
- Un thème à un code (son identifiant) et un nom
- Les thèmes sont organisés de façon arborescente, chaque thème peut donc être rattaché à un thème pere ou pas (si le theme est à la racine, le thème pere vaut null).
Voici la requete de création de ma table :
=> Vous remarquerez le "ON UPDATE CASCADE"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE TABLE `theme` ( `id_theme` varchar(16) NOT NULL default '', `nom` varchar(128) NOT NULL default '', `theme_pere` varchar(16) default NULL, PRIMARY KEY (`id_theme`), CONSTRAINT `FK_theme_1` FOREIGN KEY (`theme_pere`) REFERENCES `theme` (`id_theme`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Avec ça, j'étais persuadé que lorsque je modifierais l'identifiant id_theme, ça mettrait à jour automatiquement tous les theme_pere de la table
Or, il n'en est rien
Voici mon 1er problème :
Quand je lance la requête suivante : (je précise qu'il existe dans ma table un theme ayant id_theme valant A et qui a des themes fils avec theme_pere valant A)
MySQL me répond :UPDATE theme SET id_theme='TEST' WHERE id_theme='A';
Et là je m'interroge puisque je croyais que le 'ON UPDATE CASCADE' était précisément le bon moyen d'éviter de violer la contrainte lors d'un update ... ???Envoyé par MySQL
Voici mon 2e problème :
Je me suis dit "qu'a cela ne tienne, je vais faire mes modifs avec des transactions", pensant que je pouvais modifier mes id comme voulais du moment que l'etat des donnée respecterait la contrainte au moment ou je balance mon "commit"
J'ai donc essayé la transaction suivante :
et là, MySQL me répond toujours :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SET AUTOCOMMIT=0; START TRANSACTION; UPDATE theme SET theme_pere='TEST' WHERE theme_pere='A'; UPDATE theme SET id_theme='TEST' WHERE id_theme='A'; COMMIT;
Envoyé par MySQL
D'où mes questions :
- Pourquoi le 'ON UPDATE CASCADE' ne joue pas son rôle ?
- Pourquoi ma transaction ne passe pas ?
- Y'a-t-il un réglage spécial à faire sur la conf de MySQL ?
- Pourquoi je comprends paaas ?
Si l'un d'entre vous avait la réponse, ne serait-ce qu'a une de ces questions, je lui en serait reconaissant à vie !
Merci d'avance
Partager