ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql-更新触发器的不同日期

2019-10-24 17:23:46  阅读:142  来源: 互联网

标签:mysql date insert triggers


我正在做一个项目,却被这个触发器卡住了.这是涉及的两个表.

    ---------------+---------------+------+-----+---------+----------------+
| 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是相关的,并且当第二张表映像上有INSERT时,我需要一个触发器来更新dias_tra 1上的dias_tra来更新id_tra = id_tra_rec.
那是相对容易的,但奇怪的是,Insert可以具有不同的数据,但是具有相同的日期(fecha_rec),因此触发器必须知道是否存在具有相同ID和相同日期(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;

对不起,我的英文,第一次来,希望您能谅解.如果您需要更多信息,我在这里:)

解决方法:

您无需说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)

标签:mysql,date,insert,triggers
来源: https://codeday.me/bug/20191024/1922446.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有