MySQL - 在插入之前创建触发器以替换日期

时间:2017-01-23 12:40:08

标签: mysql date triggers insert

我遇到了一个小问题。

我想在MySQL中插入一个名为 date 的时间戳字段的表。

如果我使用带有str_to_date的查询进行常规插入,则效果很好。 但是,我的程序不支持在查询中使用函数。 所以我需要找到另一种方式,我正在考虑使用触发器,例如:

DELIMITER //
CREATE TRIGGER audit_oracle_date
BEFORE INSERT ON audit_oracle FOR EACH ROW
BEGIN
SET NEW.date = STR_TO_DATE(NEW.date, "%d %b %Y %H:%i:%s");
END
//
DELIMITER ;

但它不起作用。触发器已创建,但在尝试输入如下查询时:

insert into audit_oracle values("20 Jan 2017 18:01:25","IFOMCP00","sdfdsfds","zerzerez","aaaa","SYSDBA","1","'select * from bla'","ddd","eee","2")

它给我一条错误消息,说“日期字段不能为NULL”

有关如何编码此触发器的任何想法吗?

常规的,有效的查询(使用str_to_date)例如:

insert into audit_oracle values(str_to_date("20 Jan 2017 18:01:25", "%d %b %Y %H:%i:%s"),"IFOMCP00","sdfdsfds","zerzerez","aaaa","SYSDBA","1","blabla","ddd","eee","2")
再次感谢! 的问候,

1 个答案:

答案 0 :(得分:1)

无论好坏,当MySQL处理VALUES时,都会发生转换。问题是MySQL没有识别日期格式。

我的建议是在现场进行转换,如上一个示例所示。

如果您真的想使用触发器执行此操作,可以添加另一个字符串列,插入该列,然后使用触发器:

insert into audit_oracle(datestr, . . .)
     values('20 Jan 2017 18:01:25', 'IFOMCP00', 'sdfdsfds', 'zerzerez', 'aaaa', 'SYSDBA', '1', '''select * from bla''', 'ddd', 'eee', '2');

然后你的触发器看起来像:

DELIMITER //
CREATE TRIGGER audit_oracle_date
BEFORE INSERT ON audit_oracle FOR EACH ROW
BEGIN
    SET NEW.date = STR_TO_DATE(NEW.datestr, "%d %b %Y %H:%i:%s");
END
//
DELIMITER ;