MYSQL, TRIGGER, OLD, NEW

Flux__ Messages postés 29 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 31 janvier 2007 - 25 sept. 2006 à 15:21
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 - 29 sept. 2006 à 16:24
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__

6 réponses

crilun Messages postés 114 Date d'inscription lundi 10 mai 2004 Statut Membre Dernière intervention 17 octobre 2006
25 sept. 2006 à 18:42
crilun
pourrais tu preciser ton message d'erreur?
0
Flux__ Messages postés 29 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 31 janvier 2007 1
26 sept. 2006 à 08:42
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__
0
crilun Messages postés 114 Date d'inscription lundi 10 mai 2004 Statut Membre Dernière intervention 17 octobre 2006
26 sept. 2006 à 09:50
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
0
Flux__ Messages postés 29 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 31 janvier 2007 1
27 sept. 2006 à 15:31
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__

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Flux__ Messages postés 29 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 31 janvier 2007 1
28 sept. 2006 à 10:31
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__
0
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
29 sept. 2006 à 16:24
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;//
0
Rejoignez-nous