2
votes

Mettre à jour la date distincte du déclencheur

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 :)


1 commentaires

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,


3 Réponses :


0
votes

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;


2 commentaires

END IF pas ENDIF


ça n'a pas marché pour moi: (mais merci pour l'aide :)



1
votes

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)


1 commentaires

Super, je ne m'en suis pas rendu compte. Merci beaucoup :)



0
votes

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; $$


0 commentaires