我想使用触发器将行拆分为 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$$