Je fais un projet et je suis resté bloqué sur ce déclencheur. Voici les deux tables concernées.
create trigger dias_tra after insert on datos_recogida for each row begin if (select fecha_rec from datos_recogida where id_tra_rec=new.id_trarec and fecha_rec=new.fecha_rec) update datos_trabajadores set dias_tra = dias_tra +1 where id_tra=new.id_tra_rec end if; end;
Dans ce cas, id_tra et id_tra_rec sont liés, et j'ai besoin d'un déclencheur pour mettre à jour le dias_tra sur dias_tra + 1 pour id_tra = id_tra_rec lorsqu'il y a un INSERT sur la deuxième image de la table. C'est relativement facile mais la chose étrange est que l'insert peut avoir des données différentes mais la même date ( fecha_rec ), donc le déclencheur doit savoir s'il y a une ligne avec le même identifiant et la même date ( fecha_rec ) pour ne pas mettre à jour le dias_tra . Quelque chose comme une sélection distincte. Voici ce que j'ai essayé:
---------------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+---------------+------+-----+---------+----------------+ | id_tra | int(11) | NO | PRI | NULL | auto_increment | | nombre_tra | varchar(100) | NO | | NULL | | | apellidos_tra | varchar(100) | NO | | NULL | | | dni_tra | varchar(1000) | NO | | NULL | | | telefono_tra | int(10) | NO | | NULL | | | falta_tra | date | NO | | NULL | | | dias_tra | int(255) | NO | | NULL | | +---------------+---------------+------+-----+---------+----------------+ +--------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------+------+-----+---------+----------------+ | id_rec | int(11) | NO | PRI | NULL | auto_increment | | id_tra_rec | int(11) | NO | MUL | NULL | | | id_var_rec | int(11) | NO | MUL | NULL | | | fecha_rec | date | NO | | NULL | | | cantidad_rec | int(255) | NO | | NULL | | +--------------+----------+------+-----+---------+----------------+
Désolé pour mon anglais, première fois ici, j'espère que vous comprenez. Si vous avez besoin de plus d'informations, je suis ici :)
3 Réponses :
Vous pouvez utiliser existe
pour vérifier s'il existe un enregistrement avec les mêmes données.
BEGIN IF(EXISTS(select fecha_rec from datos_recogida where id_tra_rec=new.id_trarec and fecha_rec=new.fecha_rec)) THEN //If the record exists do what you need. ELSE update datos_trabajadores set dias_tra = dias_tra +1 where id_tra=new.id_tra_rec END IF; END;
END IF pas ENDIF
ça n'a pas marché pour moi: (mais merci pour l'aide :)
Vous ne dites pas quand datos_trabajadores est créé alors voici un déclencheur qui vérifie et crée si nécessaire. J'ai utilisé un comptage simple pour vérifier si vérifier si id_tra_rec et fecha_rec existent déjà - c'est un déclencheur après insertion, donc un compte de 1 signifie que c'est le premier. notez que la debug_table est là pour déboguer que vous devriez supprimer lorsque vous êtes satisfait.
drop table if exists datos_recogida,datos_trabajadores; create table datos_trabajadores ( id_tra int(11) auto_increment primary key, nombre_tra varchar(100) , apellidos_tra varchar(100) , dni_tra varchar(1000) , telefono_tra int(10) , falta_tra date , dias_tra int(255) ) ; create table datos_recogida ( id_rec int(11) auto_increment primary key, id_tra_rec int(11) , id_var_rec int(11) , fecha_rec date , cantidad_rec int(255) ); drop trigger if exists t; delimiter $$ create trigger t after insert on datos_recogida for each row begin if (select count(*) from datos_recogida where id_tra_rec = new.id_tra_rec and fecha_rec = new.fecha_rec) = 1 then insert into debug_table(msg) values (concat('not found:',new.id_tra_rec,':',new.fecha_rec)); if not exists(select 1 from datos_trabajadores where dias_tra = new.id_tra_rec) then insert into debug_table(msg) values ('inserting'); insert into datos_trabajadores(dias_tra,nombre_tra) values (new.id_tra_rec,1); else insert into debug_table(msg) values ('Updating'); update datos_trabajadores set nombre_tra = nombre_tra + 1 where dias_tra = new.id_tra_rec; end if; end if; end $$ delimiter ; truncate table debug_table; truncate table datos_recogida; truncate table datos_trabajadores; insert into datos_recogida (id_tra_rec,fecha_rec) values (1,'2019-01-01'), (1,'2019-01-01'), (1,'2019-01-02'); select * from debug_table; select * from datos_trabajadores; MariaDB [sandbox]> select * from debug_table; +----+------------------------+------+ | id | msg | MSG2 | +----+------------------------+------+ | 1 | not found:1:2019-01-01 | NULL | | 2 | inserting | NULL | | 3 | not found:1:2019-01-02 | NULL | | 4 | Updating | NULL | +----+------------------------+------+ 4 rows in set (0.00 sec) MariaDB [sandbox]> select * from datos_trabajadores; +--------+------------+---------------+---------+--------------+-----------+----------+ | id_tra | nombre_tra | apellidos_tra | dni_tra | telefono_tra | falta_tra | dias_tra | +--------+------------+---------------+---------+--------------+-----------+----------+ | 1 | 2 | NULL | NULL | NULL | NULL | 1 | +--------+------------+---------------+---------+--------------+-----------+----------+ 1 row in set (0.00 sec)
Super, je ne m'en suis pas rendu compte. Merci beaucoup :)
La solution de P.Salmon m'a aidé à trouver une manière simplifiée de le faire. Merci à tous et espère aider quelqu'un.
drop trigger if exists dias_tra; delimiter $$ CREATE TRIGGER dias_tra AFTER INSERT ON datos_recogida FOR EACH ROW BEGIN DECLARE dias INT; SET dias = (SELECT COUNT(DISTINCT fecha_rec) AS diasmes FROM datos_recogida WHERE id_tra_rec=NEW.id_tra_rec); UPDATE datos_trabajadores SET dias_tra = dias where id_tra=NEW.id_tra_rec; END; $$
Essayez un test s'il n'existe pas. ET chaque si a besoin d'un ALORS et vous ne semblez pas définir de délimiteurs,