繁体   English   中英

Mysql触发器不起作用。 将当前日期添加到where子句

[英]Mysql Trigger not working. Add current date to where clause

我是MySQL触发器的新手。

我考虑了日期,将触发器复制行复制到另一个表。

CREATE TRIGGER `new` AFTER INSERT ON `employee`
FOR EACH ROW
insert into employee_log (first_name, last_name)
select first_name, last_name from employee
where start_date = '2013-07-11'

我的员工表start_date格式为date 如何获取当前日期为start_date = '2013-07-12'

我在触发器中尝试了start_date = now() ,但未复制任何内容。

我的employee表结构如下。

CREATE TABLE `employee` (
  `id` int(11) DEFAULT NULL,
  `first_name` varchar(30) DEFAULT NULL,
  `last_name` varchar(15) DEFAULT NULL,
  `start_date` date DEFAULT NULL,
  `end_date` varchar(10) DEFAULT NULL,
  `city` varchar(10) DEFAULT NULL,
  `description` varchar(15) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

当向该表中插入记录触发器时,检查start_date今天/当前日期,然后将行复制到employee_log表中。

CREATE TABLE `employee_log` (
  `id` int(11) DEFAULT NULL,
  `first_name` varchar(50) DEFAULT NULL,
  `last_name` varchar(50) DEFAULT NULL,
  `start_date` date DEFAULT NULL,
  `end_date` date DEFAULT NULL,
  `city` varchar(50) DEFAULT NULL,
  `description` varchar(50) DEFAULT NULL,
  `Lasinserted` time DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

尝试这个:

DELIMITER $$

CREATE TRIGGER `employee_new` AFTER INSERT 
ON `employee` FOR EACH ROW 
BEGIN
  IF (new.start_date >= currdate ()) 
  THEN 
  INSERT INTO employee_log (first_name, last_name) 
  VALUES
    (new.first_name, new.last_name) ;
  END IF ;
END $$

DELIMITER ;

使用date_format函数将now()格式化为当前日期

CREATE TRIGGER `new` AFTER INSERT ON `employee`
FOR EACH ROW
insert into employee_log (first_name, last_name)
select first_name, last_name from employee
where start_date = DATE_FORMAT(now(),'%Y-%m-%d') /*DATE_FORMAT(now(),'%Y-%m-%d') represents current date as format %Y-%m-%d

如果您想将触发器保持为单陈述式(即不更改定界符并使用BEGIN...END块),并且仍然可以执行此工作,则可以执行以下操作

CREATE TRIGGER `tg_employee_after_insert` 
AFTER INSERT ON `employee`
FOR EACH ROW
  INSERT INTO employee_log (id, first_name, last_name, end_date, city, description, Lasinserted)
  SELECT NEW.id, 
         NEW.first_name, 
         NEW.last_name, 
         NEW.end_date, 
         NEW.city, 
         NEW.description, 
         NOW()
    FROM dual
   WHERE NEW.start_date = CURDATE();

这是SQLFiddle演示

您可以检查新添加的start_date是否为curdate() 如果为'true''insert'到日志表中。

范例

delimiter //

CREATE TRIGGER `new` AFTER INSERT ON `employee`
FOR EACH ROW BEGIN
  CASE WHEN NEW.start_date = CURRENT_DATE THEN
    INSERT
      INTO employee_log( first_name, last_name )
    VALUES ( NEW.first_name, NEW.last_name );
  END CASE;
END;
//

delimiter ;

但是,通过了解表结构及其名称,我假设您要记录employee表的最新添加记录。 为此,您必须包括记录中的所有列。

范例

  CASE WHEN NEW.start_date = CURRENT_DATE THEN
    INSERT
      INTO employee_log( id, first_name, last_name, 
                         start_date, end_date,
                         city, description, Lasinserted )
    VALUES ( NEW.id, NEW.first_name, NEW.last_name, 
             NEW.start_date, NEW.end_date,
             NEW.city, NEW.description, NEW.lasinserted );
  END CASE;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM