1

我有一张桌子,我需要 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

4 回答 4

0

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

我假设应定义 lastmod 列:

 `LASTMOD` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP ,

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

编辑:

哎呀,不应该冒险这些事情。从手册:

不可能将当前时间戳设为一列的默认值,而将另一列的自动更新值设为默认值。

于 2011-01-07T14:02:02.843 回答
0

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

两者都有一个技巧,但是由于它没有记录,因此也不可靠(实际上我不确定它是否仍然有效)。

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

对于表中的一个 TIMESTAMP 列,您可以将当前时间戳指定为默认值和自动更新值。可以将当前时间戳设置为用于初始化列、自动更新值或两者的默认值。不可能将当前时间戳设为一列的默认值,而另一列的自动更新值

作为一种解决方法,您可以使用 BEFORE INSERT 或 BEFORE UPDATE 触发器来设置这些值之一。

于 2011-01-07T14:04:34.053 回答
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 应该在此后自动更新。

于 2011-01-07T14:09:45.853 回答
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 将在对记录进行更改时将其自身更新为当前时间

于 2011-01-07T14:26:12.587 回答