【问题标题】:mysql - trigger when a row created [closed]mysql - 创建行时触发[关闭]
【发布时间】:2023-03-08 08:47:01
【问题描述】:

当向a 表插入一行时,我想在b 表中触发create new rows

我有一张像这样的staff_leave_application 表:

id |  staff     |   leave type  | start date | end date       |  is half  |
---+------------+---------------+------------+----------------+-----------+
 1 | John Doe   |  Casual Leave | 17/01/2013 | 20/01/2013     |     0     |

如果在这个表中插入一行,那么它会触发并插入到另一个表leave

要插入leave表的数据:

将日期范围start date - end date 拆分为当天,例如:

17/01/2013 - 20/01/2013 will be

17/01/2013
18/01/2013
19/01/2013
20/01/2013

现在每天插入leave 表的每一行,以及staff_leave_applications 列ID, staff, leave type

感谢Sharsh,我按照@Shaharsh shah 的回答得到了这个。

DELIMITER $$

USE `mydb`$$

CREATE
    /*!50017 DEFINER = 'root'@'localhost' */
    TRIGGER `tn_air_staff_leave_application` AFTER INSERT ON `staff_leave_application` 
    FOR EACH ROW BEGIN
        SET @counter := -1; 
        WHILE (@counter < DATEDIFF(DATE(new.end_date), DATE(new.start_date))) DO 
            INSERT INTO `leave`(staff_id_staff, leave_type_id_leave_type, staff_leave_application_id_staff_leave_application, leave_date) 
            VALUES (new.staff_id_staff, new.leave_type_id_leave_type, new.id_staff_leave_application, DATE_ADD(new.start_date, INTERVAL @counter:=@counter + 1 DAY)); 
        END WHILE; 
END;
$$

【问题讨论】:

    标签: mysql database triggers insert


    【解决方案1】:

    试试这个:

    DELIMITER $$
    
    DROP TRIGGER /*!50032 IF EXISTS */ `tn_air_staff_leave_application`$$
    
    CREATE
        /*!50017 DEFINER = 'root'@'localhost' */
        TRIGGER `tn_air_staff_leave_application` AFTER INSERT ON `staff_leave_application` 
        FOR EACH ROW BEGIN
            SET @counter := -1; 
            WHILE (@counter < DATEDIFF(DATE(new.endDate), DATE(new.startDate))) DO 
                INSERT INTO `leave`(staffId, leaveType, leaveDate) 
                VALUES (new.id, new.leaveType, DATE_ADD(new.startDate, INTERVAL @counter:=@counter + 1 DAY)); 
            END WHILE; 
    END;
    $$
    
    DELIMITER ;
    

    删除触发器

    DELIMITER $$
    
    DROP TRIGGER /*!50032 IF EXISTS */ `tn_adr_staff_leave_application`$$
    
    CREATE
        /*!50017 DEFINER = 'root'@'localhost' */
        TRIGGER `tn_adr_staff_leave_application` AFTER DELETE ON `staff_leave_application` 
        FOR EACH ROW BEGIN
              DELETE FROM `leave` WHERE staffId = old.id;
    END;
    $$
    
    DELIMITER ;
    

    【讨论】:

    • 亲爱的 Saharsh,感谢您抽出宝贵时间回答我的问题。愿上帝保佑你。我明天会告诉我代码是否有效。再次感谢。问候拉胡尔
    • @user1983017 检查删除触发器和我更新的答案
    • 天哪,您的代码正在运行。非常感谢。
    猜你喜欢
    • 2017-02-09
    • 2011-02-03
    • 2016-09-19
    • 1970-01-01
    • 2019-07-11
    • 2015-02-23
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    相关资源
    最近更新 更多