MySQL,表有两个日期?

时间:2011-01-07 13:59:09

标签: mysql database timestamp mysql-error-1067

我有一张桌子,我需要firstmod和lastmod

firstmod需要是创建行的时间戳。 lastmod需要将自己更新为当前时间。

这是我到目前为止所拥有的......

CREATE  TABLE IF NOT EXISTS `SiteGen_JamesM_Live`.`PAGES` (
  `ID` INT(11) NOT NULL AUTO_INCREMENT ,
  `USER_ID` INT(11) NOT NULL ,
  `TITLE` VARCHAR(100) NOT NULL ,
  `HTML` LONGTEXT NOT NULL ,
  `FIRSTMOD` TIMESTAMP NOT NULL DEFAULT 0 ,
  `LASTMOD` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
  PRIMARY KEY (`ID`) )
ENGINE = InnoDB
AUTO_INCREMENT = 5
DEFAULT CHARACTER SET = latin1

这就是我得到的回报:

Executing SQL script in server
ERROR: Error 1067: Invalid default value for 'FIRSTMOD'

4 个答案:

答案 0 :(得分:0)

即使我不熟悉MySQL,我也会冒回答的风险。

我假设应该定义lastmod列:

 `LASTMOD` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP ,

没有指定DEFAULT。它的默认值将来自ON UPDATE子句。

编辑:

哎呀,不应冒这些风险。从手册:

  

不可能有   当前时间戳是默认值   一列和自动更新   另一列的价值。

答案 1 :(得分:0)

表格中只能有一列CURRENT_TIMESTAMP。你必须选择,它是DEFAULT(插入时)还是ON UPDATE(或者你可以有两个修饰符,但是在一列中)。

有一个技巧可以同时拥有,但由于它没有文档,它也是不可靠的(实际上我不确定它是否仍然有效)。

在此处查看更多内容:http://dev.mysql.com/doc/refman/5.5/en/timestamp.html

  

对于表中的一个TIMESTAMP列,   您可以分配当前时间戳   作为默认值和   自动更新值。有可能   将当前时间戳设为   初始化的默认值   列,用于自动更新值,或   都。这是不可能的   当前时间戳是默认值   一列和自动更新   另一栏的价值

作为一种变通方法,您可以使用BEFORE INSERT或BEFORE UPDATE触发器来设置其中一个值。

答案 2 :(得分:0)

试试这个:

`FIRSTMOD` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' ,
`LASTMOD` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

然后在你的插页中

INSERT INTO PAGES (FIRSTMOD, LASTMOD) VALUES (NULL, NULL)

FIRSTMOD列应该在插入时获得有效的时间戳,LASTMOD应该在此后自动更新。

答案 3 :(得分:0)

试试这个

CREATE TABLE IF NOT EXISTS `PAGES` (
  `ID` INT(11) NOT NULL AUTO_INCREMENT ,
  `USER_ID` INT(11) NOT NULL ,
  `TITLE` VARCHAR(100) NOT NULL ,
  `HTML` LONGTEXT NOT NULL ,
  `FIRSTMOD` datetime NOT NULL,  
  `LASTMOD` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
  PRIMARY KEY (`ID`) )
ENGINE = InnoDB
AUTO_INCREMENT = 5
DEFAULT CHARACTER SET = latin1 

并设置触发器以更新插入

上的FIRSTMOD
Create Trigger Insert_PAGES
  After INSERT On PAGES
  For Each Row
  Begin
   set new.FIRSTMOD = now();
  End

这将在创建记录时设置 firstmod = now()的时间 并且 lastmod 会将其自身更新为当对记录进行更改时的当前时间