Trigger mysql erifier existance avant insert

Fermé
sezam2 Messages postés 73 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 26 mars 2010 - 2 juin 2009 à 18:13
 Le marocain - 18 juil. 2009 à 17:19
Bonjour,
je dispose d'une table "hosts" que voici:
DROP TABLE IF EXISTS `syslog`.`hosts`;
CREATE TABLE `syslog`.`hosts` (
`host_name` varchar(60) default NULL,
`site` varchar(50) default NULL,
`ip_adress` varchar(30) NOT NULL default '',
`statut` int(10) unsigned default NULL,
`history_length` int(10) unsigned default NULL,
PRIMARY KEY (`ip_adress`),
KEY `index_host` (`ip_adress`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


je veut faire un trigger qui verifie si ip_adress existe avant insertion si c'est le cas l'insertion ne se fait pas étant un clée primaire on est sur que le simple insert fera l'affaire mai on m'a dit c'est pas propre comme moyen ;

INSERT INTO hosts (ip_adress) VALUES ( '$HOST')

donc j'ai tenté ça
CREATE TRIGGER test BEFORE INSERT syslog.'hosts'
FOR EACH ROW BEGIN
DECLARE @x VARCHAR(30);
SET @x = (SELECT ip_adress FROM hostq WHERE ip_adress = NEW.ipadress);
IF @x IS NOT NULL THEN INSERTINTO hosts (ip_adress) VALUES (NEW.ipadress );
else         ; 


mais j'ai un message d'erreur insert if not exist



ma question est la suivante

1 qu'es ce qui cloche dans mon triggeer ?

2 J'ai vu qu'il y a une autre solution insert if not exists mais ça ne marche pas ça n'insère pas.

je suis ouvet à toute vo prposition

2 réponses

Bonjour,

moi aussi j'avais un problème pour les trigger sous Mysql mais j'ai réussi "hamdolilah" à réalisé deux exemples qui marche, bien à vous ts.

voilà un 1er exemple :


delimiter //
CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount < 0 THEN
SET NEW.amount = 0;
ELSEIF NEW.amount > 100 THEN
SET NEW.amount = 100;
END IF;
END//
delimiter ;



2ème exemple :


drop trigger cont_depart_update;

DELIMITER //
CREATE TRIGGER cont_depart_update AFTER UPDATE ON tacheassigne
FOR EACH ROW
BEGIN
DECLARE idProjet varchar(20);
DECLARE moyenneAcompli varchar(5);
select p.idp into @idProjet
from projet p inner join tache t on p.idp = t.idp inner join tacheassigne ta on t.idtache = ta.idtache where ta.idta=New.idta;

select avg(ta.accompli) into @moyenneAcompli
from projet p inner join tache t on p.idp = t.idp inner join tacheassigne ta on t.idtache = ta.idtache where ta.idta in (select ta.idta from projet p inner join tache t on p.idp = t.idp inner join tacheassigne ta on t.idtache = ta.idtache where p.idp=@idProjet)
group by p.idp;
update projet set accompli=@moyenneAcompli where idp=@idProjet;
END//
delimiter;



/////////////////////////////////////////////////////////////////////////////////
RQ :
* en mysql c'est "NEW" c'est pas comme ORACLE ":NEW"
* utiliser les delimiter (existe aussi au niveau de la console de mysql)
* l'appel des varriables c'est avec "@" et non & comme ORACLE
/////////////////////////////////////////////////////////////////////////////////
1
dam75 Messages postés 1041 Date d'inscription lundi 4 mai 2009 Statut Webmaster Dernière intervention 21 février 2023 67
2 juin 2009 à 19:06
Bonjour,

Effectivement le trigger sera très lent ... La méthode la plus "propre" pour moi :
1/ mets une clé unique sur ip_adress (UNIQUE KEY `ip_address` (ìp_address`) )
2/ utilise la syntaxe INSERT IGNORE INTO hosts ...

Le IGNORE dit à MySQL de ne pas tenir compte de l'erreur d'insertion, et la clé unique garantit que tu ne pourras pas avoir 2 fois la même IP dans ta table :)

Bon courage
0