Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/05/2008, 23h58   #1
Membre régulier
 
Inscription : octobre 2007
Messages : 251
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : octobre 2007
Messages : 251
Points : 87
Points : 87
Par défaut Trigger MySQL on insert

Bonjour,

J'ai une table contenant les records de joueurs.

Pour que le classement soit cohérent, lors de l'insertion d'un record, je dois décaler les classement des joueurs moins bon d'une place.

Pour cela je pensais passer par un trigger de ce style :

Code :
1
2
3
4
5
6
7
 
CREATE TRIGGER insert_record AFTER INSERT
ON record FOR EACH ROW
BEGIN
	SET OLD.classement = OLD.classement + 1
	WHERE OLD.score < NEW.score
END
Alors MySQL me retourne l'erreur suivante :
Code :
Updating of OLD row IS NOT allowed IN TRIGGER
J'en déduis qu'on ne peut pas changer la valeur de OLD.

OK mais alors comment fait-on pour désigner :
- les colonnes de la ligne que l'on va insérer (le score à insérer)
- les colonnes de la ligne sur laquelle on fait le test, (les scores existants)
- les nouvelles valeurs des colonnes de la ligne qui est en train d'être testée ? (la nouvelle valeur d'un score déjà existant)

Si c'est pas très clair hésitez pas à me le faire savoir, je sais que c'est pas simple à expliquer

Merci beaucoup
popovitch130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2008, 11h08   #2
Nouveau Membre du Club
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2008
Messages : 24
Points : 25
Points : 25
Bonjour,
La table OLD fait référence au(x) ligne(s) modifiée(s) ou supprimée(s).

La table NEW contient la ligne qui va être insérée.

Un principe possible pour ton trigger est avant d'insérer, de modifier le classement.

Un Before insert.
Un update pour modifier le classement des joueurs moins bon.
rewsna est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2008, 19h12   #3
Membre régulier
 
Inscription : octobre 2007
Messages : 251
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : octobre 2007
Messages : 251
Points : 87
Points : 87
Merci rewsna de me filer un coup de pouce c'est sympa.

Pour "OLD", MySQL n'en veut pas sur un trigger "on insert".
Quand j'enlève OLD, il me dit que classement n'est pas une variable système connue. Du coup je spécifie la table mais il n'en veut pas non plus
Code :
1
2
3
4
5
6
7
 
CREATE TRIGGER insert_record BEFORE INSERT
ON record FOR EACH ROW
BEGIN
	SET record.classement = record.classement + 1
	WHERE record.score < record.score
END
popovitch130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2008, 12h55   #4
Nouveau Membre du Club
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2008
Messages : 24
Points : 25
Points : 25
Bonjour
En cherchant, je viens de m'apercevoir que Mysql ne supporté pas de
insert/update/delete sur la même table que le trigger insert. Dans le but d'empecher les appels recursifs infinis.

Deux solutions pour contourner le problème :
- Déplacer la modification des lignes du coté applicatif.
- Utiliser une table temporaire.

Il y a peut être d'autres solutions.
rewsna est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2008, 19h15   #5
Membre régulier
 
Inscription : octobre 2007
Messages : 251
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : octobre 2007
Messages : 251
Points : 87
Points : 87
Ok je comprends mieux
ça fonctionne comment la table temporaire ?
Le traitement c'est :

àprès chaque insert sur table temporaire, on reclasse la "vrai table" et on insére le nouvel enregistrement ?

(Parce que si l'applicatif plante au milieu d'une action d'INSERT la base est vérollée ...)

MErci
popovitch130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h35.


 
 
 
 
Partenaires

Hébergement Web