Trigger mysql erifier existance avant insert
sezam2
Messages postés
73
Date d'inscription
Statut
Membre
Dernière intervention
-
Le marocain -
Le marocain -
Bonjour,
je dispose d'une table "hosts" que voici:
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
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
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
A voir également:
- Trigger mysql erifier existance avant insert
- Touche insert - Guide
- Avant browser - Télécharger - Navigateurs
- Disk boot failure insert system disk and press enter - Guide
- Mysql community server - Télécharger - Bases de données
- Comment remettre ma page d'accueil comme avant - Guide
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
/////////////////////////////////////////////////////////////////////////////////
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
/////////////////////////////////////////////////////////////////////////////////
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
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