MySQL触发器需要调整

时间:2011-08-06 23:16:59

标签: mysql triggers

我有一个触发器,在插入新行时在表行中设置日期时间字段。 (不要打扰我说我可以在表定义中执行此操作,我已经有第二个使用该功能的日期时间字段,而且每个表只能使用一列。)

此触发器非常适合我的目的:

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语句需要内部分号。

1 个答案:

答案 0 :(得分:1)

NEW.created的测试是NULL,如果设置它是因为你已经在insert语句中设置了它,如果它是NULL然后它需要当前时间作为值,这样的事情会做特技:

if NEW.created is NULL THEN
   SET NEW.created = now();
end if