Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL,有两个日期的表?_Mysql_Database_Timestamp_Mysql Error 1067 - Fatal编程技术网

MySQL,有两个日期的表?

MySQL,有两个日期的表?,mysql,database,timestamp,mysql-error-1067,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 ,

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

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

我假设应该定义lastmod列:

 `LASTMOD` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP ,
如果没有默认值,请指定。它的默认值将通过ON UPDATE子句实现

编辑:

哎呀,不该拿这些东西冒险。从手册中:

这是不可能的 当前时间戳不能是默认值 对于一列和自动更新 另一列的值


一个表中只能有一列具有当前\u时间戳。您必须选择是插入时使用默认值还是更新时使用默认值,或者您可以同时使用两个修改器,但只在一列中

两者都有一个窍门,但由于它没有文档记录,所以也不可靠,实际上我不确定它是否仍然有效

请参阅此处的更多信息:

对于表中的一个时间戳列, 您可以指定当前时间戳 作为默认值和 自动更新值。有可能 当前时间戳是否为 初始化的默认值 列,用于自动更新值,或 二者都这是不可能的 当前时间戳不能是默认值 对于一列和自动更新 另一列的值

作为一种解决方法,您可以使用“插入前”或“更新前”触发器来设置其中一个值。

尝试以下操作:

`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应该在插入后自动更新。

试试这个

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会将其自身更新到当前时间,以便对记录进行任何更改

谢谢,它不起作用并且令人困惑。。如果注册,我将尝试+1:MySQL手册页将默认0显示为正确用法,并且需要一个允许数据库中有0个日期的标志。或者,你可以在那里用一个真实的约会。是的,应该是这样。在上有很多有用的注释,还有一些替代建议,包括使用触发器进行更新,这需要做更多的设置工作,但不需要将NULL传递给INSERT.um中的那些字段,抱歉,我认为FIRSTMOD使用此技术应该是默认的0。我刚刚在osx上的本地mysql版本5.1.23中运行了此功能:创建表测试id INT DEFAULT 0,FIRSTMOD TIMESTAMP NOT NULL DEFAULT 0,LASTMOD TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP on UPDATE CURRENT_TIMESTAMP;插入测试FIRSTMOD,LASTMOD值NULL,NULL;然后我等了一会儿,运行更新测试集id=1;从测试中选择*;结果是| 1 | 2011-01-07 09:55:06 | 2011-01-07 09:55:18 |。。。对我来说是可行的,也许你正在使用的是mysql版本?我不知道Paul建议的方法,但我怀疑它是否可行0000-00-00 00:00:00'不是时间戳的有效默认值,因为它从'1970-01-01 00:00:00'开始。您可以尝试改用0,但它不会起任何作用。可能是因为:我仍然认为它不起作用。我如何在未登录时提出我的问题?