我有一个触发器,在插入新行时在表行中设置日期时间字段。 (不要打扰我说我可以在表定义中执行此操作,我已经有第二个使用该功能的日期时间字段,而且每个表只能使用一列。)
此触发器非常适合我的目的:
CREATE TRIGGER foobar_insert
BEFORE INSERT ON foobar
FOR EACH ROW SET NEW.created=NOW();
因此,无论何时插入新行,foobar.created
都会设置为当前时间。当我这样做时,这很棒:
INSERT INTO foobar(foo)VALUES('bar');
唯一的问题是,如果我想在insert语句中显式设置foobar.created
,它会被触发器覆盖。
所以,
INSERT INTO foobar(foo,created)VALUES('foo','2006-01-01 12:12:12');
导致foobar.created
等于插入时间,而不是插入语句中指定的时间。
所以我的问题是:如果我的触发器还没有值,我怎样才能将触发器更改为仅设置foobar.created
?
编辑:
回应下面的james_bond,这是有效的:
DELIMITER $$
DROP TRIGGER IF EXISTS foobar_insert$$
CREATE TRIGGER foobar_insert
BEFORE INSERT ON foobar
FOR EACH ROW
IF NEW.created IS NULL THEN
SET NEW.created=NOW();
END IF$$
DELIMITER ;
注意我必须包含DELIMITER
语句,因为IF
语句需要内部分号。
答案 0 :(得分:1)
NEW.created
的测试是NULL
,如果设置它是因为你已经在insert语句中设置了它,如果它是NULL然后它需要当前时间作为值,这样的事情会做特技:
if NEW.created is NULL THEN
SET NEW.created = now();
end if