mysql触发器按条件插入多个表

mysql触发器按条件插入多个表,mysql,triggers,Mysql,Triggers,我想使用触发器将行拆分为两个不同的表,如果行数超过5,则只将5行插入表中,将其他行插入表中。我有一个工作触发器,它只在一个触发器中插入行,我在问题的底部包括了触发器和数据库代码 当前工作触发器 我有一个名为staff\u leave\u application的表,其中有以下列: 身份证员工请假申请|员工身份证员工|请假类型|身份证员工请假类型|开始日期|结束日期|加入日期| 它有一个名为tn_air_staff_leave_application的触发器: 更新的触发器 *这个想法是一个新的循

我想使用触发器将行拆分为两个不同的表,如果行数超过5,则只将5行插入表中,将其他行插入表中。我有一个工作触发器,它只在一个触发器中插入行,我在问题的底部包括了触发器和数据库代码

当前工作触发器

我有一个名为staff\u leave\u application的表,其中有以下列:

身份证员工请假申请|员工身份证员工|请假类型|身份证员工请假类型|开始日期|结束日期|加入日期|

它有一个名为tn_air_staff_leave_application的触发器:

更新的触发器

*这个想法是一个新的循环计数器,在它打破第一个循环之前,它会变为5。 *一个新的二次循环计数器在2或更多的时候中断,不确定要求是什么,也许你在二次循环中不需要它 *你原来的计数器在第二个循环中调整为+4,不确定是哪一个,有点困惑,但我认为应该是+4或者是倒数 -6 好的,我已经编辑过了,我认为这就是新的逻辑。。许多柜台都换了

好吧,我明白了,现在你必须照你说的去做。。在你进入任何循环之前。。loop1可执行的最大次数为@balance times。。loop2它应该强制执行剩余的时间。。我认为u应该在开始时设置一个名为leave_counter的新计数器,它将确定leave循环将执行多少次

BEGIN

        set @loopcounter := 0;
        set @counter:= -1;
        set @balance:= (SELECT new_balance FROM leave_balance_view WHERE staff_id_staff = new.staff_id_staff and leave_type_id_leave_type = new.leave_type_id_leave_type);
    set @leavecounter:=+(@balance - 1);


       -- set @newrows:= (select count(*) from tn_air_staff_leave_application);

        WHILE ((@counter < DATEDIFF(DATE(new.end_date), DATE(new.start_date))) && (@loopcounter < @balance) && (@balance>0)) DO 
                        INSERT INTO `leave`(staff_leave_application_id_staff_leave_application, staff_leave_application_staff_id_staff, leave_type_id_leave_type, date, active, date_updated) 
                        VALUES (new.id_staff_leave_application, new.staff_id_staff, new.leave_type_id_leave_type, DATE_ADD(new.start_date, INTERVAL @counter:=@counter + 1 DAY), 1, CURDATE()); 
            set @loopcounter := @loopcounter + 1;
        set @balance := @balance - 1;
                    END WHILE; 

        WHILE ((@leavecounter < DATEDIFF(DATE(new.end_date), DATE(new.start_date)))) DO 
            INSERT INTO `nonpay_leave`(staff_leave_application_id_staff_leave_application, staff_leave_application_staff_id_staff, leave_type_id_leave_type, date, active, date_updated) 
            VALUES (new.id_staff_leave_application, new.staff_id_staff, new.leave_type_id_leave_type, DATE_ADD(new.start_date, INTERVAL @leavecounter:=@leavecounter + 1 DAY), 1, CURDATE()); 
            end while;
    END$$
底线: 我通过引入一个名为leave_counter的新计数器来编辑您的sql命令,该计数器将确定您的leave_循环应该运行多少次。。同样在第一个循环中,我通过在第一个循环中引入@balance来确保它的执行次数不超过@balance。。你可以看到编辑后的回复。。循环1:执行最大@平衡时间。。。循环2:执行休假天数-@余额时间

*这个想法是一个新的循环计数器,在它打破第一个循环之前,它会变为5。 *一个新的二次循环计数器在2或更多的时候中断,不确定要求是什么,也许你在二次循环中不需要它 *你原来的计数器在第二个循环中调整为+4,不确定是哪一个,有点困惑,但我认为应该是+4或者是倒数 -6 好的,我已经编辑过了,我认为这就是新的逻辑。。许多柜台都换了

好吧,我明白了,现在你必须照你说的去做。。在你进入任何循环之前。。loop1可执行的最大次数为@balance times。。loop2它应该强制执行剩余的时间。。我认为u应该在开始时设置一个名为leave_counter的新计数器,它将确定leave循环将执行多少次

BEGIN

        set @loopcounter := 0;
        set @counter:= -1;
        set @balance:= (SELECT new_balance FROM leave_balance_view WHERE staff_id_staff = new.staff_id_staff and leave_type_id_leave_type = new.leave_type_id_leave_type);
    set @leavecounter:=+(@balance - 1);


       -- set @newrows:= (select count(*) from tn_air_staff_leave_application);

        WHILE ((@counter < DATEDIFF(DATE(new.end_date), DATE(new.start_date))) && (@loopcounter < @balance) && (@balance>0)) DO 
                        INSERT INTO `leave`(staff_leave_application_id_staff_leave_application, staff_leave_application_staff_id_staff, leave_type_id_leave_type, date, active, date_updated) 
                        VALUES (new.id_staff_leave_application, new.staff_id_staff, new.leave_type_id_leave_type, DATE_ADD(new.start_date, INTERVAL @counter:=@counter + 1 DAY), 1, CURDATE()); 
            set @loopcounter := @loopcounter + 1;
        set @balance := @balance - 1;
                    END WHILE; 

        WHILE ((@leavecounter < DATEDIFF(DATE(new.end_date), DATE(new.start_date)))) DO 
            INSERT INTO `nonpay_leave`(staff_leave_application_id_staff_leave_application, staff_leave_application_staff_id_staff, leave_type_id_leave_type, date, active, date_updated) 
            VALUES (new.id_staff_leave_application, new.staff_id_staff, new.leave_type_id_leave_type, DATE_ADD(new.start_date, INTERVAL @leavecounter:=@leavecounter + 1 DAY), 1, CURDATE()); 
            end while;
    END$$
底线:
我通过引入一个名为leave_counter的新计数器来编辑您的sql命令,该计数器将确定您的leave_循环应该运行多少次。。同样在第一个循环中,我通过在第一个循环中引入@balance来确保它的执行次数不超过@balance。。你可以看到编辑后的回复。。循环1:执行最大@平衡时间。。。循环2:执行休假天数-@balance times…

Friend!我的计数器不是固定的,它是一个灵活的值。你的答案是使用固定值。请您更改它,以便它可以使用灵活的值。比如,如果触发器生成10行且conter=4,则插入4行以离开,另一行插入非Pay_离开。请记住计数器是flexibleu hv,用于将变量计数器存储在表中,并从该表中获取值。。。比如说configurationtable列1=键列2=值。。。所以第1列=计数器第2列=1或3或5或其他。。在触发器集合内@counter=从configurationtable中选择计数器。。这就是我设置它的方法..或者你可以在全局变量集中设置它@@counter=value required并从全局变量中获取counter的值。。不确定在这种情况下该如何工作,以及u wud在何处设置该全局变量。。我说的是MS Sql server..当然我忘了它必须设置为@counter=select COLUMNNAME1 from configurationtable,其中COLUMNNAME1=counter;我相信你明白我的意思,但仍然!朋友我的计数器不是固定的,它是一个灵活的值。你的答案是使用固定值。请您更改它,以便它可以使用灵活的值。比如,如果触发器生成10行且conter=4,则插入4行以离开,另一行插入非Pay_离开。请记住计数器是flexibleu hv,用于将变量计数器存储在表中,并从该表中获取值。。。比如说configurationtable列1=键列2=值。。。所以第1列=计数器第2列=1或3或5或其他。。在触发器集合内@counter=从configurationtable中选择计数器。。这就是我设置它的方法..或者你可以在全局变量集中设置它@@counter=value required并从全局变量中获取counter的值。。不确定在这种情况下该如何工作,以及u wud在何处设置该全局变量。。我说的是MS Sql server..当然我忘了它必须设置为@counter=select COLUMNNAME1 from configurationtable where COLUMNNAME1=计数器;我相信你明白我的意思,但仍然!
BEGIN
    set @loopcounter := 0;
    set @counter:= -1;
    set @balance:= (SELECT new_balance FROM leave_balance_view WHERE staff_id_staff = new.staff_id_staff and leave_type_id_leave_type = new.leave_type_id_leave_type);
   -- set @newrows:= (select count(*) from tn_air_staff_leave_application);

    WHILE ((@counter < DATEDIFF(DATE(new.end_date), DATE(new.start_date))) && (@loopcounter < @balance)) DO 
                    INSERT INTO `leave`(staff_leave_application_id_staff_leave_application, staff_leave_application_staff_id_staff, leave_type_id_leave_type, date, active, date_updated) 
                    VALUES (new.id_staff_leave_application, new.staff_id_staff, new.leave_type_id_leave_type, DATE_ADD(new.start_date, INTERVAL @counter:=@counter + 1 DAY), 1, CURDATE()); 
        set @loopcounter := @loopcounter + 1;
                END WHILE; 

    set @counter:=+(@balance - 1);
    set @loopcounter:=0;
    WHILE ((@counter < DATEDIFF(DATE(new.end_date), DATE(new.start_date))) && (@loopcounter < 2)) DO 
        INSERT INTO `nonpay_leave`(staff_leave_application_id_staff_leave_application, staff_leave_application_staff_id_staff, leave_type_id_leave_type, date, active, date_updated) 
        VALUES (new.id_staff_leave_application, new.staff_id_staff, new.leave_type_id_leave_type, DATE_ADD(new.start_date, INTERVAL @counter:=@counter + 1 DAY), 1, CURDATE()); 
        end while;
END$$
set @loopcounter := 0;
set @counter:= -1;

WHILE ((@counter < DATEDIFF(DATE(new.end_date), DATE(new.start_date))) && (@loopcounter <5)) DO 
            INSERT INTO `leave`(staff_leave_application_id_staff_leave_application, staff_leave_application_staff_id_staff, leave_type_id_leave_type, date, active, date_updated) 
            VALUES (new.id_staff_leave_application, new.staff_id_staff, new.leave_type_id_leave_type, DATE_ADD(new.start_date, INTERVAL @counter:=@counter + 1 DAY), 1, CURDATE()); 
set @loopcounter := @loopcounter + 1;
        END WHILE; 

set @counter:=+4 (basically adjusting for the previous 5 that u marked in)
set @loopcounter:=0;
WHILE ((@counter < DATEDIFF(DATE(new.end_date), DATE(new.start_date))) && (@loopcounter <2)) DO 
insert into NO_PAY_LEAVE
BEGIN

        set @loopcounter := 0;
        set @counter:= -1;
        set @balance:= (SELECT new_balance FROM leave_balance_view WHERE staff_id_staff = new.staff_id_staff and leave_type_id_leave_type = new.leave_type_id_leave_type);
    set @leavecounter:=+(@balance - 1);


       -- set @newrows:= (select count(*) from tn_air_staff_leave_application);

        WHILE ((@counter < DATEDIFF(DATE(new.end_date), DATE(new.start_date))) && (@loopcounter < @balance) && (@balance>0)) DO 
                        INSERT INTO `leave`(staff_leave_application_id_staff_leave_application, staff_leave_application_staff_id_staff, leave_type_id_leave_type, date, active, date_updated) 
                        VALUES (new.id_staff_leave_application, new.staff_id_staff, new.leave_type_id_leave_type, DATE_ADD(new.start_date, INTERVAL @counter:=@counter + 1 DAY), 1, CURDATE()); 
            set @loopcounter := @loopcounter + 1;
        set @balance := @balance - 1;
                    END WHILE; 

        WHILE ((@leavecounter < DATEDIFF(DATE(new.end_date), DATE(new.start_date)))) DO 
            INSERT INTO `nonpay_leave`(staff_leave_application_id_staff_leave_application, staff_leave_application_staff_id_staff, leave_type_id_leave_type, date, active, date_updated) 
            VALUES (new.id_staff_leave_application, new.staff_id_staff, new.leave_type_id_leave_type, DATE_ADD(new.start_date, INTERVAL @leavecounter:=@leavecounter + 1 DAY), 1, CURDATE()); 
            end while;
    END$$