|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre confirmé
![]() Ingé. Info. Inscription : janvier 2008 Messages : 338 ![]() |
Bonjour j'ouvre mon nouveau problème dans un nouveau fil, l'ancien commençant à être un peu long.
Code :
Une entrée T1 a une colonne parent qui pointe sur une autre entrée T1. T2 à pour identifiant le même id que l'entrée sur T1 à laquelle il correspond. T1 a la propriété on cascade delete activé, et qui fonctionne. Mon pb -> le trigger fonctionne partiellement, càd lors d'une suppression d'une entrée sur T1, la suppression se passe sur l'entrée correspondante sur T2. En revanche si la suppression est soumise "à la cascade" ça ne marche pas. Ou est mon erreur..? Merci bien.
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 852 ![]() |
comme je l'ai dit dans l'autre post tu dois le paramètrer au niveau de la colonne concernée et en myisam je suis pas sur que ça marche... il me semble que tu dois être en innodb
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
00
|
|
|
#3 |
|
Membre confirmé
![]() Ingé. Info. Inscription : janvier 2008 Messages : 338 ![]() |
T1 est en innoDB.
T2 en MyIsam. Quand je fais un delete sur T1 et que l'entrée a un fils(qui se supprime bien), mysql ne considère pas ça comme une condition pour "rentrer" dans mon trigger ? Je trouve ça illogique. ça voudrait dire que un delete et un delete issu d'une cascade ne sont pas fait de la même manière.
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 852 ![]() |
ton trigger est local à une table
la cascade est un comportement d'intégrité référentielle donc pas du tout les même choses même si ça touche à une action commune qui les déclenche
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
00
|
|
|
#5 |
|
Membre confirmé
![]() Ingé. Info. Inscription : janvier 2008 Messages : 338 ![]() |
Donc la seule solution, serait de virer mes foreign key et mon cascade et de mettre un trigger à la place
on delete, delete fils ET delete sur T2. ça semble propre mais niveau performance, j'en ai aucune idée.
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 852 ![]() |
lit ça : contrainte de cascade
tu peux les laisser, ça les auto indexe au moins... mais sinon je pense que c'est la solution... ou change le moteur de ta table myisam...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
00
|
|
|
#7 | ||
|
Membre confirmé
![]() Ingé. Info. Inscription : janvier 2008 Messages : 338 ![]() |
Je ne peux pas changer le MyIsam, j'en ai besoin pour faire de l'indexage fullText (chose qu'innoDB ne fait pas)
Je n'arrive pas, ni en conservant le cascading ni en l'enlevant, à mettre en place un trigger qui me supprime mon entrée fille. Code :
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS |
||
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 852 ![]() |
la solution est de passer par une procédure stockée alors...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
00
|
|
|
#9 | ||||
|
Membre confirmé
![]() Ingé. Info. Inscription : janvier 2008 Messages : 338 ![]() |
J'obtient ça comme message d'erreur
Code :
Alors deux solution s'offrent à moi (voire 3 si je continue à chercher): la première changer de sgbd... Ou alors faire une procédure stockée récursive. Du genre : Code :
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS |
||||
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 852 ![]() |
pas du tout comme ça
les tableaux n'existent pas en mysql... tu dois faire au moins un set @@max_sp_recursion_depth=255; pour permettre le maximum de niveau de récursion (moins si tu sais la profondeur maximum)... Code sql :
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
||
|
|
00
|
|
|
#11 | ||
|
Membre confirmé
![]() Ingé. Info. Inscription : janvier 2008 Messages : 338 ![]() |
Merci pour cette procédure.
Même si y'a 2-3 lignes que je ne comprend pas encore, je viens de l'essayer. Et ça me crache une erreur: Code :
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS |
||
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 852 ![]() |
autan pour moi, j'avais pompé le début de ton code sans le changer :p
Code sql :
CREATE PROCEDURE cascade_delete (IN current_id int(4))
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
00
|
|
|
#13 | ||
|
Membre confirmé
![]() Ingé. Info. Inscription : janvier 2008 Messages : 338 ![]() |
Exact, en revanche, ça serait trop simple de fonctionner directement !
Code :
j'ai regardé un peu sur le net et ils disent de faire un mysql_upgrade, et sur phpmyadmin... je sais pas ou le faire ou même si c'est la bonne solution
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS |
||
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 852 ![]() |
tu as quelle version de mysql?
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
|
|
00
|
|
|
#15 |
|
Membre confirmé
![]() Ingé. Info. Inscription : janvier 2008 Messages : 338 ![]() |
Apache/2.2.17 (Win32) PHP/5.3.6
Version du client MySQL: mysqlnd 5.0.8-dev - 20102224 - $Revision: 308673 $
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS |
|
|
00
|
|
|
#16 |
|
Membre confirmé
![]() Ingé. Info. Inscription : janvier 2008 Messages : 338 ![]() |
Enfin.. non j'ai trouvé ça plutot, c'est écrit en plus gros:
MYSQL 5.5.10
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS |
|
|
00
|
|
|
#17 | ||
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 852 ![]() |
ça les prend en charge...
bon le truc complet qui doit marcher avec : db le nom de la base qui contiendra la procédure stockée Code sql :
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
||
|
|
00
|
|
|
#18 | ||
|
Membre confirmé
![]() Ingé. Info. Inscription : janvier 2008 Messages : 338 ![]() |
J'ai fais un avec l'invite de commande, et ça m'a donc effectivement laisser enregistrer ma procédure.
Par contre quand je l'exécute ça me dit: Code :
Je pense que ça a un rapport avec cette ligne: Code :
declare continue handler FOR SQLSTATE '02000' SET done=1;
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS |
||
|
|
00
|
|
|
#19 | ||
|
Membre Expert
![]() Eric DureuilDéveloppeur informatique Inscription : avril 2011 Messages : 852 ![]() |
oui j'ai oublié de mettre l'ouverture et la fermeture, dernière rectification
Code sql :
__________________
Eric Dureuil, développeur web, c/c++, java indépendant soyons ![]() pensez à mettre et
|
||
|
|
10
|
|
|
#20 |
|
Membre confirmé
![]() Ingé. Info. Inscription : janvier 2008 Messages : 338 ![]() |
PARFAIT !
ça marche ! Merci bcp j'ai simplement à rajouter une ligne delete pour agir sur l'autre table comme je le souhaitais au début. Je met le post en résolu
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com