Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : MYSQL, TRIGGER, OLD, NEW [ MySQL / Procédures Stockées ] (Flux__)

lundi 25 septembre 2006 à 15:21:37 | MYSQL, TRIGGER, OLD, NEW

Flux__

Bonjour,

J'ai un problème de trigger sous MySQL.

Je souhaiterais supprimer un enregistrement si il existe déja et inserer le nouveau à la place.

Je m'explique :

Sois la table t_user, avec les champs suivant :
- matricule (PK)
- pwd
- mail
- tel

J'ai dans ma base l'enregistrment existant suivant : 123456, monPassword, toto@france.com, 5.32.69

Lors de l'insert suivant :
insert into t_user (matricule,pwd,mail,tel) values (123456, monPassword, toto@france.com, 5.32.69)

Je ne veux pas que Mysql me crie une erreur de PK. Mais qu'il supprime dans tout les cas l'ancien enregistrement pour insérer le nouveau sans problème.

J'ai coder le trigger suivant :

delimiter //
create trigger tri BEFORE INSERT
on t_user
for each row
begin
set @mat=new.matricule;
delete from t_user where old.matricule = @mat;
end;//

Mais j'ai une erreur. Pouvez-vous m'aider dans ma démarche ?

Bonne journée.
Flux__

lundi 25 septembre 2006 à 18:42:39 | Re : MYSQL, TRIGGER, OLD, NEW

crilun



crilun
pourrais tu preciser ton message d'erreur?

mardi 26 septembre 2006 à 08:42:15 | Re : MYSQL, TRIGGER, OLD, NEW

Flux__

Bonjour,

Escuser-moi j'ai oublié de préciser le code d'erreur renvoyer par MySQL.

Je répare mon erreur :

ERROR 1363 (HY000): There is no OLD row in on INSERT trigger

Merci, Bonne journée

Flux__

mardi 26 septembre 2006 à 09:50:09 | Re : MYSQL, TRIGGER, OLD, NEW

crilun



crilun
bizarre comme erreur en tout cas la réponse est dans ton message d'erreur,
ca genere une erreur si il n'y a rien a supprimer,
test donc si ton enregistrement existe avant de le supprimer a l'aide de :

if exist (SELECT * FROM t_user where old.matricule=@mat)
then
'Suppression de l'enregistrement

mercredi 27 septembre 2006 à 11:18:30 | Re : MYSQL, TRIGGER, OLD, NEW

sim51

Membre Club
Bonjour,
Moi je dis que c'est normal que le old pose un problème et je vais vous le démontrer en posant une question. Sur quoi pointe le old en insert ????
Ba sur rien !!! Le old fonctionnement simpement sur les trigger en update.

create trigger tri BEFORE INSERT on t_user for each row
begin
    set @mat=new.matricule;
    set @pwd = new.pwd
    ...
    //on cherche si l'enregistrement existe déjà
    temp =  "SELECT count(*) FROM t_user where matricule=@mat "
    if temp<>0 then
          //il existe déjà un enregistrement et tu le supprime
        delete from t_user where old.matricule = @mat;
    //maintenant tu fais ton insertion
     insert into t_user (matricule,pwd,mail,tel) values (@mat, @pwd, @mail, @tel)
end;

bonne continuation

N'oubliez d'aller voir le règlement de C-S ici
N'oubliez pas de cliquer sur réponse acceptée si la réponse vous convient !!!

mercredi 27 septembre 2006 à 15:31:19 | Re : MYSQL, TRIGGER, OLD, NEW

Flux__

Bonjour,

Merci pour cette réponse. je n'ai pas pus répondre avant.

Je test dès que je peux et te tiens au courrant.

Flux__

++

jeudi 28 septembre 2006 à 09:43:40 | Re : MYSQL, TRIGGER, OLD, NEW

sim51

Membre Club

Re,
au fait j'ai oublié le @ devant les temp :
@temp =  "SELECT count(*) FROM t_user where matricule=@mat "
    if @temp<>0 then

Voilà.
Bonne continuation.
N'oubliez d'aller voir le règlement de C-S ici
N'oubliez pas de cliquer sur réponse acceptée si la réponse vous convient !!!

jeudi 28 septembre 2006 à 10:31:00 | Re : MYSQL, TRIGGER, OLD, NEW

Flux__

J'ai une erreur de synthase...

Voici les commandes :

use retraite;
delimiter //
create trigger tri BEFORE INSERT
on t_retraite
for each row
begin
set @mat = new.matricule;
set @pwd = new.pwd;
set @mail = new.mail;
set @tel = new.tel;
@temp =  "SELECT count(*) FROM t_retraite where matricule=@mat ";
if @temp<>0 then
delete from t_retraite where old.matricule = @mat;
insert into t_user (matricule,pwd,mail,tel) values (@mat, @pwd, @mail, @tel)
end;//

Voici l'erreur :

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '@temp
 =  "SELECT count(*) FROM t_retraite where matricule=@mat ";
if @temp<>0 t' at line 9


Merci de votre aide.

Flux__



jeudi 28 septembre 2006 à 13:58:21 | Re : MYSQL, TRIGGER, OLD, NEW

sim51

Membre Club
essaye ça :

create trigger tri BEFORE INSERT
on t_retraite
for each row
begin
set @mat = new.matricule;
set @pwd = new.pwd;
set @mail = new.mail;
set @tel = new.tel;
set @temp =  SELECT count(*) FROM t_retraite where matricule=@mat;
if @temp<>0
BEGIN
    delete from t_retraite where old.matricule = @mat;
END
insert into t_user (matricule,pwd,mail,tel) values (@mat, @pwd, @mail, @tel);
end

Je me suis trompé sur le if, dans les trigger il n'y a pas de then simplement un begin et un end (si l'instruction fait plus d'une ligne normalement).
De plus il faut un set devant le premier temp pour assigner la valeur de la requête. Si cela ne marche essaye ceci sinon :

create trigger tri BEFORE INSERT
on t_retraite
for each row
begin
set @mat = new.matricule;
set @pwd = new.pwd;
set @mail = new.mail;
set @tel = new.tel;
if exists (SELECT count(*) FROM t_retraite where matricule=@mat)
BEGIN
    delete from t_retraite where old.matricule = @mat;
END
insert into t_user (matricule,pwd,mail,tel) values (@mat, @pwd, @mail, @tel);
end

Bonne continuation.



N'oubliez d'aller voir le règlement de C-S ici
N'oubliez pas de cliquer sur réponse acceptée si la réponse vous convient !!!

vendredi 29 septembre 2006 à 16:24:56 | Re : MYSQL, TRIGGER, OLD, NEW

Malkuth

Membre Club
La je comprend pas

Je connait pas bien MySQL mais j'ai l'impression de voir un prob Tu as dis que old était vide dans un insert et tu l'utilise qdmême  vaudrais mieux pas faire :

delimiter //
create trigger tri BEFORE INSERT
on t_user
for each row
begin
delete from t_user where t_user.matricule = new.matricule;
end;//

(Et puis y'as qu'une instruction)

de plus si for each row oblige a faire un éxécution du trigger a chaque ligne c'est pas super ( bon d'accord sur des login on fait pas souvent des insert en masse :

mais je trouve plus éléguant et plus optmiser (je peux me planter encore une fois je connait pas trop MySQL):

delimiter //
create trigger tri BEFORE INSERT
on t_user
for each row
begin
delete from t_user where t_user.matricule IN (SELECT new.matricule FROM new);
end;//



Cette discussion est classé dans : mysql, user, trigger, matricule, old


Répondre à ce message

Sujets en rapport avec ce message

MySQL 5.0.x et triggers : problème d'ajout de trigger [ par Vld ] Bonjour à tous.Je cherche depuis pas mal de temps comment ajouter un trigger à ma table mais je bloque toujours au même endroit (erreur 1064, erreur d trigger [ par tuteur59000 ] BONJOURpouvez vous me decrire le choix de ces 2 triggers svp?merci create or replace Trigger Historise_ProposeBefore Update or Deleteon ProposeFor eac erreur "Supplied argument is not a valid MySQL result resource" [ par bidjoubob ] Salut,Lorsque je transfères mon site comportant du PHP et une base de données en MYSQL, j'obtiens l'erreur "Supplied argument is not a valid MySQL res options user pour mysql [ par bigjacky31 ] Bonjour tout le monde, Voici mon probleme: J'ai installé un serveur mysql sur mon pc, et j'aimerais que celui-ci soit accessible pour un utilisateur d AU SECOURS !!!!!!!!!!!!!!!!! Requete en MySQL [ par emma1006 ] Salut à tous,J'ai un petit souci pour une requete en MySQL. Ca doit pas être bien compliquémais moi je sais pas comment faire pour compacter ma demand UPDATE sur plusieurs tables [ par noreille79 ] Voilà, j'ai un problème de syntaxe pour mes requêtes, pouvez vous m'aiderN'hésitez pas à me poser des questions!<?php<br / mysql(rectification de ma question) [ par limalima ] Bonjour, j'ai installé Mysql et au moment de l'installation on me demande un pass(je pense c'est le pass du root), j'ai crée un new user avec un p problème d'héritage en mysql [ par ffrany ] Bonjour,Je dois créer une base de donnée sur mysql. Il y a des sur types et sous types dans le MCD. Le problème c'est que je ne sais pas comment repré [MSsql2005] Excecution de trigger FOR et AFTER [ par Arthenius ] Bonjour a tousj'ai une petite question.j'ai plusieurs trigger qui s'exécute sur une tableJ'aimerais savoir si les TRIGGER en FOR INSERT s'exécute avan Besoin d'aide pour une requete compliquée (à mes yeux) [ par aposfa ] Bonjour à tous,Explications :J'ai 4 tables :user (user_id, user_email, etc.....)commande (comm_id, comm_date, #user_id, etc.....)file (file_id, file_n


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,359 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.