我正在做一个项目,但被这个触发器卡住了。这是涉及的两个表。
---------------+---------------+------+-----+---------+----------------+
| 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 | |
+--------------+----------+------+-----+---------+----------------+
在这种情况下, id_tra 和 id_tra_rec 相关,我需要一个触发器来更新<当存在时, dias_tra 上的strong> dias_tra + 1( id_tra = id_tra_rec )在第二张表格图片上插入。 相对来说比较容易,但是奇怪的是,Insert可以具有不同的数据,但是具有相同的日期( fecha_rec ),因此触发器必须知道是否存在具有相同ID和相同日期的行(< strong> fecha_rec )以不更新 dias_tra 。像精选不同的东西。这是我尝试过的:
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;
对不起,我的英文,第一次来,希望您能谅解。如果您需要更多信息,请在这里:)
答案 0 :(得分:2)
您无需说出datos_trabajadores的创建时间,因此这里有一个触发器,可以根据需要进行检查和创建。我使用了一个简单的计数来检查是否已存在id_tra_rec和fecha_rec-这是插入后触发,因此计数1表示其第一个。请注意,您可以在需要调试时删除debug_table。
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 :(得分:1)
您可以使用exists
检查是否存在具有相同数据的记录。
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 :(得分:1)
P.Salmon的解决方案帮助我获得了简化的方法。谢谢大家,希望对大家有所帮助。
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; $$