Mysql 更新触发器的不同日期
我在做一个项目,我被这个触发器卡住了。这是涉及的两个表Mysql 更新触发器的不同日期,mysql,date,triggers,insert,Mysql,Date,Triggers,Insert,我在做一个项目,我被这个触发器卡住了。这是涉及的两个表 ---------------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+---------------+------+-----+---------+---------------
---------------+---------------+------+-----+---------+----------------+
| 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上的dias_-tra+1上的id_-tra=id_-rec。
这相对容易,但奇怪的是插入可能有不同的数据,但日期相同(fecha\u rec),因此触发器必须知道是否有具有相同id和相同日期(fecha\u rec)的行,才能不更新dias\u 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;
对不起我的英语,第一次来这里,希望你能理解。如果您需要更多信息,我就在这里:)您可以使用
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;
你不会说datos_trabajadores是什么时候创建的,所以这里有一个触发器,它会检查并在必要时创建。我使用了一个简单的计数来检查id_tra__rec和fecha_rec是否已经存在-这是一个后插入触发器,因此计数1意味着它是第一个。注意debug_表是用来调试的,您应该在高兴的时候删除它
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)
鲑鱼的解决方案帮助我找到了一种简单的方法。谢谢每一个人,希望能帮助别人
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; $$
如果不存在,请尝试测试。每个if都需要一个THEN,而你似乎没有设置分隔符,END if not ENDIFit对我不起作用:(但谢谢你的帮助:)太好了,我没有意识到这一点。非常感谢:)