1

我想使用触发器将行拆分为 2 个不同的表,如果行多于 5,则仅将 5 行插入 table leave,将其他行插入 table nonpay_leave。我有一个工作触发器,它只在一个中插入行(我在问题的底部包含了触发器和我的数据库代码)。

当前工作触发器

我有一个名为的表staff_leave_application,其中包含以下列:

id_staff_leave_application | staff_id_staff | leave_type_id_leave_type | start_date | end_date | joining_date

它有一个触发器,称为tn_air_staff_leave_application

DELIMITER $$

USE `mydb`$$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `mydb`.`tn_air_staff_leave_application`
AFTER INSERT ON `mydb`.`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_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$$

上面的触发器实际上做了什么?

此触发器在 insert on 之后运行 staff_leave_application。触发器将当前插入的行拆分为日期范围内的每一行,然后将行插入到每天每行staff_leave_application调用的表中。leave

然后,我到底想要什么???

我想更改此触发器,以便如果新行多于 5 行,则将其他行插入另一个名为nonpay_leave. 比如:如果触发器生成 7 行,则将前 5 行插入到表中leave,将其他 2 行插入到表中nonpay_leave

我的数据库结构

--
-- Table structure for table `designation`
--

CREATE TABLE IF NOT EXISTS `designation` (
  `id_designation` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY (`id_designation`),
  UNIQUE KEY `id_designation_UNIQUE` (`id_designation`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;

--
-- Dumping data for table `designation`
--

INSERT INTO `designation` (`id_designation`, `name`) VALUES
(10, 'Manager'),
(12, 'Medical Officer'),
(13, 'Peon');

-- --------------------------------------------------------

--
-- Table structure for table `leave`
--

CREATE TABLE IF NOT EXISTS `leave` (
  `id_leave` int(11) NOT NULL AUTO_INCREMENT,
  `staff_leave_application_id_staff_leave_application` int(11) NOT NULL,
  `staff_leave_application_staff_id_staff` int(11) NOT NULL,
  `leave_type_id_leave_type` int(11) NOT NULL,
  `date` date NOT NULL,
  `active` int(11) NOT NULL DEFAULT '1',
  `date_updated` date NOT NULL,
  PRIMARY KEY (`id_leave`,`staff_leave_application_id_staff_leave_application`,`staff_leave_application_staff_id_staff`),
  KEY `fk_table1_leave_type1` (`leave_type_id_leave_type`),
  KEY `fk_table1_staff_leave_application1` (`staff_leave_application_id_staff_leave_application`,`staff_leave_application_staff_id_staff`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=32 ;

--
-- Dumping data for table `leave`
--

INSERT INTO `leave` (`id_leave`, `staff_leave_application_id_staff_leave_application`, `staff_leave_application_staff_id_staff`, `leave_type_id_leave_type`, `date`, `active`, `date_updated`) VALUES
(21, 12, 7, 8, '2013-01-22', 1, '2013-01-21'),
(22, 12, 7, 8, '2013-01-23', 1, '2013-01-21'),
(23, 12, 7, 8, '2013-01-24', 1, '2013-01-21'),
(24, 12, 7, 8, '2013-01-25', 1, '2013-01-21'),
(25, 13, 7, 9, '2013-01-30', 1, '2013-01-21'),
(26, 13, 7, 9, '2013-01-31', 1, '2013-01-21'),
(27, 14, 7, 8, '2013-02-11', 1, '2013-01-21'),
(28, 14, 7, 8, '2013-02-12', 1, '2013-01-21'),
(29, 14, 7, 8, '2013-02-13', 1, '2013-01-21'),
(30, 14, 7, 8, '2013-02-14', 1, '2013-01-21'),
(31, 14, 7, 8, '2013-02-15', 1, '2013-01-21');

-- --------------------------------------------------------

--
-- Table structure for table `leave_allowed`
--

CREATE TABLE IF NOT EXISTS `leave_allowed` (
  `id_leave_allowed` int(11) NOT NULL AUTO_INCREMENT,
  `staff_id_staff` int(11) NOT NULL,
  `leave_type_id_leave_type` int(11) NOT NULL,
  `days` float NOT NULL,
  PRIMARY KEY (`id_leave_allowed`),
  UNIQUE KEY `id_leave_allowed_UNIQUE` (`id_leave_allowed`),
  KEY `fk_leave_allowed_staff1` (`staff_id_staff`),
  KEY `fk_leave_allowed_leave_type1` (`leave_type_id_leave_type`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `leave_allowed`
--

INSERT INTO `leave_allowed` (`id_leave_allowed`, `staff_id_staff`, `leave_type_id_leave_type`, `days`) VALUES
(1, 7, 8, 2.5),
(2, 7, 9, 200);

-- --------------------------------------------------------

--
-- Table structure for table `leave_app_view`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`1`@`localhost` SQL SECURITY DEFINER VIEW `mydb`.`leave_app_view` AS select `mydb`.`staff`.`name` AS `name`,`mydb`.`staff`.`file_no` AS `file_no`,`mydb`.`staff`.`photo` AS `photo`,`mydb`.`staff_leave_application`.`leave_type_id_leave_type` AS `leave_type_id_leave_type`,`mydb`.`staff_leave_application`.`start_date` AS `start_date`,`mydb`.`staff_leave_application`.`end_date` AS `end_date`,`mydb`.`staff_leave_application`.`joining_date` AS `joining_date` from (`mydb`.`staff` join `mydb`.`staff_leave_application` on((`mydb`.`staff`.`id_staff` = `mydb`.`staff_leave_application`.`staff_id_staff`)));

--
-- Dumping data for table `leave_app_view`
--

INSERT INTO `leave_app_view` (`name`, `file_no`, `photo`, `leave_type_id_leave_type`, `start_date`, `end_date`, `joining_date`) VALUES
('Rahul Ayan', '54', NULL, 8, '2013-01-22', '2013-01-25', '2013-01-26'),
('Rahul Ayan', '54', NULL, 9, '2013-01-30', '2013-01-31', '2013-02-01'),
('Rahul Ayan', '54', NULL, 8, '2013-02-11', '2013-02-15', '2013-02-16');

-- --------------------------------------------------------

--
-- Table structure for table `leave_balance`
--

CREATE TABLE IF NOT EXISTS `leave_balance` (
  `id_leave_balance` int(11) NOT NULL AUTO_INCREMENT,
  `staff_id_staff` int(11) NOT NULL,
  `leave_type_id_leave_type` int(11) NOT NULL,
  `balance` int(3) NOT NULL,
  `date_added` date NOT NULL,
  PRIMARY KEY (`id_leave_balance`),
  UNIQUE KEY `id_leave_balance_UNIQUE` (`id_leave_balance`),
  KEY `fk_leave_balance_staff1` (`staff_id_staff`),
  KEY `fk_leave_balance_leave_type1` (`leave_type_id_leave_type`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `leave_balance`
--

INSERT INTO `leave_balance` (`id_leave_balance`, `staff_id_staff`, `leave_type_id_leave_type`, `balance`, `date_added`) VALUES
(1, 7, 8, 230, '2013-01-21'),
(2, 7, 9, 200, '2013-01-21');

-- --------------------------------------------------------

--
-- Table structure for table `leave_balance_view`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`1`@`localhost` SQL SECURITY DEFINER VIEW `mydb`.`leave_balance_view` AS select `mydb`.`leave_balance`.`staff_id_staff` AS `staff_id_staff`,`leave_taken`.`leave_type_id_leave_type` AS `leave_type_id_leave_type`,(`mydb`.`leave_balance`.`balance` - `leave_taken`.`days`) AS `new_balance`,`mydb`.`leave_balance`.`date_added` AS `date_added` from ((`mydb`.`staff` join `mydb`.`leave_taken` on((`mydb`.`staff`.`id_staff` = `leave_taken`.`staff_leave_application_staff_id_staff`))) join `mydb`.`leave_balance` on(((`leave_taken`.`staff_leave_application_staff_id_staff` = `mydb`.`leave_balance`.`staff_id_staff`) and (`leave_taken`.`leave_type_id_leave_type` = `mydb`.`leave_balance`.`leave_type_id_leave_type`))));

--
-- Dumping data for table `leave_balance_view`
--

INSERT INTO `leave_balance_view` (`staff_id_staff`, `leave_type_id_leave_type`, `new_balance`, `date_added`) VALUES
(7, 8, 221, '2013-01-21'),
(7, 9, 198, '2013-01-21');

-- --------------------------------------------------------

--
-- Table structure for table `leave_taken`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`1`@`localhost` SQL SECURITY DEFINER VIEW `mydb`.`leave_taken` AS select `mydb`.`leave`.`staff_leave_application_staff_id_staff` AS `staff_leave_application_staff_id_staff`,`mydb`.`leave`.`leave_type_id_leave_type` AS `leave_type_id_leave_type`,count(0) AS `days` from (`mydb`.`leave` join `mydb`.`staff` on((`mydb`.`staff`.`id_staff` = `mydb`.`leave`.`staff_leave_application_staff_id_staff`))) where (`mydb`.`leave`.`active` = 1) group by `mydb`.`leave`.`leave_type_id_leave_type`;

--
-- Dumping data for table `leave_taken`
--

INSERT INTO `leave_taken` (`staff_leave_application_staff_id_staff`, `leave_type_id_leave_type`, `days`) VALUES
(7, 8, 9),
(7, 9, 2);

-- --------------------------------------------------------

--
-- Table structure for table `leave_type`
--

CREATE TABLE IF NOT EXISTS `leave_type` (
  `id_leave_type` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `paid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_leave_type`),
  UNIQUE KEY `id_leave_type_UNIQUE` (`id_leave_type`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

--
-- Dumping data for table `leave_type`
--

INSERT INTO `leave_type` (`id_leave_type`, `name`, `paid`) VALUES
(8, 'Casual Leave', NULL),
(9, 'Medical Leave', NULL);

-- --------------------------------------------------------

--
-- Table structure for table `nonpay_leave`
--

CREATE TABLE IF NOT EXISTS `nonpay_leave` (
  `id_nonpay_leave` int(11) NOT NULL AUTO_INCREMENT,
  `staff_leave_application_id_staff_leave_application` int(11) NOT NULL,
  `staff_leave_application_staff_id_staff` int(11) NOT NULL,
  `leave_type_id_leave_type` int(11) NOT NULL,
  `leave_date` date DEFAULT NULL,
  `active` int(1) DEFAULT NULL,
  `date_updated` date DEFAULT NULL,
  PRIMARY KEY (`id_nonpay_leave`,`staff_leave_application_id_staff_leave_application`,`staff_leave_application_staff_id_staff`),
  KEY `fk_nonpay_leave_staff_leave_application1` (`staff_leave_application_id_staff_leave_application`,`staff_leave_application_staff_id_staff`),
  KEY `fk_nonpay_leave_leave_type1` (`leave_type_id_leave_type`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Dumping data for table `nonpay_leave`
--


-- --------------------------------------------------------

--
-- Table structure for table `staff`
--

CREATE TABLE IF NOT EXISTS `staff` (
  `id_staff` int(11) NOT NULL AUTO_INCREMENT,
  `file_no` varchar(45) NOT NULL,
  `title_id_title` int(11) NOT NULL,
  `name` varchar(80) NOT NULL,
  `dob` date DEFAULT NULL,
  `designation_id_designation` int(11) NOT NULL,
  `status_id_status` int(11) NOT NULL,
  `date_of_join` date DEFAULT NULL,
  `photo` blob,
  `user_name` varchar(10) DEFAULT NULL,
  `password` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id_staff`),
  UNIQUE KEY `id_staff_UNIQUE` (`id_staff`),
  KEY `fk_staff_title` (`title_id_title`),
  KEY `fk_staff_designation1` (`designation_id_designation`),
  KEY `fk_staff_status1` (`status_id_status`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `staff`
--

INSERT INTO `staff` (`id_staff`, `file_no`, `title_id_title`, `name`, `dob`, `designation_id_designation`, `status_id_status`, `date_of_join`, `photo`, `user_name`, `password`) VALUES
(7, '54', 10, 'Rahul Ayan', '1991-09-14', 10, 6, '2012-01-02', NULL, NULL, NULL);

-- --------------------------------------------------------

--
-- Table structure for table `staff_leave_application`
--

CREATE TABLE IF NOT EXISTS `staff_leave_application` (
  `id_staff_leave_application` int(11) NOT NULL AUTO_INCREMENT,
  `staff_id_staff` int(11) NOT NULL,
  `leave_type_id_leave_type` int(11) NOT NULL,
  `start_date` date NOT NULL,
  `end_date` date NOT NULL,
  `joining_date` date NOT NULL,
  PRIMARY KEY (`id_staff_leave_application`,`staff_id_staff`),
  UNIQUE KEY `id_staff_leave_UNIQUE` (`id_staff_leave_application`),
  KEY `fk_staff_leave_staff1` (`staff_id_staff`),
  KEY `fk_staff_leave_leave_type1` (`leave_type_id_leave_type`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;

--
-- Dumping data for table `staff_leave_application`
--

INSERT INTO `staff_leave_application` (`id_staff_leave_application`, `staff_id_staff`, `leave_type_id_leave_type`, `start_date`, `end_date`, `joining_date`) VALUES
(12, 7, 8, '2013-01-22', '2013-01-25', '2013-01-26'),
(13, 7, 9, '2013-01-30', '2013-01-31', '2013-02-01'),
(14, 7, 8, '2013-02-11', '2013-02-15', '2013-02-16');

--
-- Triggers `staff_leave_application`
--
DROP TRIGGER IF EXISTS `tn_air_staff_leave_application`;
DELIMITER //
CREATE 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_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
//
DELIMITER ;

-- --------------------------------------------------------

--
-- Table structure for table `status`
--

CREATE TABLE IF NOT EXISTS `status` (
  `id_status` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(45) NOT NULL,
  PRIMARY KEY (`id_status`),
  UNIQUE KEY `id_ststus_UNIQUE` (`id_status`),
  UNIQUE KEY `type_UNIQUE` (`type`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `status`
--

INSERT INTO `status` (`id_status`, `type`) VALUES
(6, 'Contract'),
(7, 'Permanent');

-- --------------------------------------------------------

--
-- Table structure for table `title`
--

CREATE TABLE IF NOT EXISTS `title` (
  `id_title` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) NOT NULL,
  PRIMARY KEY (`id_title`),
  UNIQUE KEY `id_title_UNIQUE` (`id_title`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;

--
-- Dumping data for table `title`
--

INSERT INTO `title` (`id_title`, `name`) VALUES
(10, 'Mr'),
(11, 'Dr'),
(12, 'Mrs'),
(13, 'Miss');

--
-- Constraints for dumped tables
--

--
-- Constraints for table `leave`
--
ALTER TABLE `leave`
  ADD CONSTRAINT `fk_table1_leave_type1` FOREIGN KEY (`leave_type_id_leave_type`) REFERENCES `leave_type` (`id_leave_type`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_table1_staff_leave_application1` FOREIGN KEY (`staff_leave_application_id_staff_leave_application`, `staff_leave_application_staff_id_staff`) REFERENCES `staff_leave_application` (`id_staff_leave_application`, `staff_id_staff`) ON DELETE CASCADE ON UPDATE NO ACTION;

--
-- Constraints for table `leave_allowed`
--
ALTER TABLE `leave_allowed`
  ADD CONSTRAINT `fk_leave_allowed_leave_type1` FOREIGN KEY (`leave_type_id_leave_type`) REFERENCES `leave_type` (`id_leave_type`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_leave_allowed_staff1` FOREIGN KEY (`staff_id_staff`) REFERENCES `staff` (`id_staff`) ON DELETE CASCADE ON UPDATE NO ACTION;

--
-- Constraints for table `leave_balance`
--
ALTER TABLE `leave_balance`
  ADD CONSTRAINT `fk_leave_balance_leave_type1` FOREIGN KEY (`leave_type_id_leave_type`) REFERENCES `leave_type` (`id_leave_type`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_leave_balance_staff1` FOREIGN KEY (`staff_id_staff`) REFERENCES `staff` (`id_staff`) ON UPDATE NO ACTION;

--
-- Constraints for table `nonpay_leave`
--
ALTER TABLE `nonpay_leave`
  ADD CONSTRAINT `fk_nonpay_leave_staff_leave_application1` FOREIGN KEY (`staff_leave_application_id_staff_leave_application`, `staff_leave_application_staff_id_staff`) REFERENCES `staff_leave_application` (`id_staff_leave_application`, `staff_id_staff`) ON DELETE CASCADE ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_nonpay_leave_leave_type1` FOREIGN KEY (`leave_type_id_leave_type`) REFERENCES `leave_type` (`id_leave_type`) ON DELETE NO ACTION ON UPDATE NO ACTION;

--
-- Constraints for table `staff`
--
ALTER TABLE `staff`
  ADD CONSTRAINT `fk_staff_designation1` FOREIGN KEY (`designation_id_designation`) REFERENCES `designation` (`id_designation`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_staff_status1` FOREIGN KEY (`status_id_status`) REFERENCES `status` (`id_status`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_staff_title` FOREIGN KEY (`title_id_title`) REFERENCES `title` (`id_title`) ON DELETE NO ACTION ON UPDATE NO ACTION;

--
-- Constraints for table `staff_leave_application`
--
ALTER TABLE `staff_leave_application`
  ADD CONSTRAINT `fk_staff_leave_leave_type1` FOREIGN KEY (`leave_type_id_leave_type`) REFERENCES `leave_type` (`id_leave_type`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_staff_leave_staff1` FOREIGN KEY (`staff_id_staff`) REFERENCES `staff` (`id_staff`) ON DELETE CASCADE ON UPDATE NO ACTION;

更新触发器

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$$
4

1 回答 1

1
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
  • *这个想法是一个新的 loop_counter,它会在它跳出第一个循环之前达到 5。
  • *一个新的第二个循环计数器,它在 2 或更多处中断(不确定要求是什么,也许你在第二个循环中不需要它)
  • *你的原始计数器在第二个循环中调整为 +4(不确定是哪一个,有点困惑,但我认为它应该是 +4 或者它应该是 -6)

好的,我已经编辑并认为这就是新的逻辑 shud b .. 许多计数器已经改变


好吧,我明白你了,现在你必须按照你说的去做......在你进入任何循环之前......我想你应该在开始时设置一个名为 leave_counter 的新计数器,这将决定离开循环将执行多少次。

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$$

BOTTOMLINE:::::: 我已经编辑了你的 sql 命令,引入了一个名为 leave_counter 的新计数器,它将确定你的 leave_loop shud 运行多少次.. 同样在第一个循环中,我确保它执行的次数不超过 @balance通过在第一个循环中引入@balance 次.. 你可以看到编辑后的回复.. 循环 1:执行最大(@balance)次...循环 2:执行(休假天数)-(@balance)次...

于 2013-01-22T06:26:12.770 回答