在 MySQL 4.0中同时具有 Created 和 Last Updated 时间戳列

我有以下表模式;

CREATE TABLE `db1`.`sms_queue` (
`Id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`Message` VARCHAR(160) NOT NULL DEFAULT 'Unknown Message Error',
`CurrentState` VARCHAR(10) NOT NULL DEFAULT 'None',
`Phone` VARCHAR(14) DEFAULT NULL,
`Created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
`TriesLeft` tinyint NOT NULL DEFAULT 3,
PRIMARY KEY (`Id`)
)
ENGINE = InnoDB;

它失败了,并出现以下错误:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.

我的问题是,我能同时拥有这两个领域吗?或者我必须在每个事务期间手动设置 LastUpdated 字段?

177790 次浏览

您可以同时拥有它们,只需在创建的字段上去掉“ CURRENT _ TIMESTAMP”标志即可。无论何时在表中创建新记录,只要使用“ NOW ()”作为值即可。

或者。

相反,删除‘ ON UPDATE CURRENT _ TIMESTAMP’标志并为该字段发送 NOW ()。这样更有道理。

摘自 MySQL 5.5文档 :

表中的一个 TIMESTAMP 列可以将当前时间戳作为初始化该列的默认值,也可以作为自动更新值,或者两者兼而有之。当前时间戳不可能是一个列的默认值,而是另一个列的自动更新值。

MySQL 5.6.5的变化 :

以前,每个表中最多只能有一个 TIMESTAMP 列被自动初始化或更新到当前日期和时间。这项限制已经取消。任何 TIMESTAMP 列定义都可以有 DEFAULT CURRENT _ TIMESTAMP 子句和 ON UPDATE CURRENT _ TIMESTAMP 子句的任意组合。此外,这些子句现在可以与 DATETIME 列定义一起使用。有关更多信息,请参见 TIMESTAMP 和 DATETIME 的自动初始化和更新。

如果您确实决定让 MySQL 处理时间戳的更新,那么您可以设置一个触发器来更新插入时的字段。

CREATE TRIGGER <trigger_name> BEFORE INSERT ON <table_name> FOR EACH ROW SET NEW.<timestamp_field> = CURRENT_TIMESTAMP;

参考文献: http://dev.mysql.com/doc/refman/5.0/en/triggers.html

这就是如何使用触发器自动和灵活地创建 createDate/lastAmendment 字段的方法:

首先这样定义它们:

CREATE TABLE `entity` (
`entityid` int(11) NOT NULL AUTO_INCREMENT,
`createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastModified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`name` varchar(255) DEFAULT NULL,
`comment` text,
PRIMARY KEY (`entityid`),
)

然后添加以下触发因素:

DELIMITER ;;
CREATE trigger entityinsert BEFORE INSERT ON entity FOR EACH ROW BEGIN SET NEW.createDate=IF(ISNULL(NEW.createDate) OR NEW.createDate='0000-00-00 00:00:00', CURRENT_TIMESTAMP, IF(NEW.createDate<CURRENT_TIMESTAMP, NEW.createDate, CURRENT_TIMESTAMP));SET NEW.lastModified=NEW.createDate; END;;
DELIMITER ;
CREATE trigger entityupdate BEFORE UPDATE ON entity FOR EACH ROW SET NEW.lastModified=IF(NEW.lastModified<OLD.lastModified, OLD.lastModified, CURRENT_TIMESTAMP);
  • 如果没有指定 createDate 或 lastAmendment,则它们将相等并设置为当前时间戳。
  • 如果您在没有指定 createDate 或 lastAmendment 的情况下对它们进行 更新,lastAmendment 将被设置为当前时间戳。

但好消息是:

  • 如果使用 插入,则可以指定一个 比当前时间戳旧的 createDate,允许从旧时代进行导入以使其工作正常(lastAmendment 将等于 createDate)。
  • 如果你是 更新,你可以指定一个 LastAmendment 比前一个值更老(’0000-00-0000:00:00:00:00’工作的很好) ,允许更新一个条目,如果你正在做美观的改变(修复一个注释中的打字错误) ,你想 保持旧的最后修改日期。这不会修改最后修改的日期。

这个问题在 MySQL 5.6中似乎已经解决了。直到 MySQL 5.5,我才注意到这一点; 下面是一个示例代码:

DROP TABLE IF EXISTS `provider_org_group` ;
CREATE TABLE IF NOT EXISTS `provider_org_group` (
`id` INT NOT NULL,
`name` VARCHAR(100) NOT NULL,
`type` VARCHAR(100) NULL,
`inserted` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`insert_src_ver_id` INT NULL,
`updated` TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
`update_src_ver_id` INT NULL,
`version` INT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC),
UNIQUE INDEX `name_UNIQUE` (`name` ASC))
ENGINE = InnoDB;

在 MySQL 5.5上运行这个命令会得到:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

在 MySQL 5.6上运行

0 row(s) affected   0.093 sec

至于 MySQL 5.6,它很简单... ... 试试看:

create table tweet (
id integer not null auto_increment primary key,
stamp_created timestamp default now(),
stamp_updated timestamp default now() on update now(),
message varchar(163)
)
create table test_table(
id integer not null auto_increment primary key,
stamp_created timestamp default '0000-00-00 00:00:00',
stamp_updated timestamp default now() on update now()
);

来源: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/

我的网络主机卡在了 mysql 的5.1版本上,所以像我这样没有升级选项的人可以遵循以下指示:

Http://joegornick.com/2009/12/30/mysql-created-and-modified-date-fields/

我认为这是一个更好的戳记创建和戳记更新查询

CREATE TABLE test_table(
id integer not null auto_increment primary key,
stamp_created TIMESTAMP DEFAULT now(),
stamp_updated TIMESTAMP DEFAULT '0000-00-00 00:00:00' ON UPDATE now()
);

因为在创建记录时,stamp_created应该由 now()填充,而 stamp_updated应该由 '0000-00-00 00:00:00'填充

对于 mysql 5.7.21,我使用以下代码并且工作得很好:

创建表 Posts( 时间戳不为空默认值 CURrent _ TIMESTAMP ON UPDATE CURrent _ TIMESTAMP, created_at时间戳 NOTNULL 默认值 CURRENT _ TIMESTAMP )

这将添加两个用于创建和更新的列。 两者都会在插入和更新时得到更新。

   create table users(
id integer not null auto_increment primary key,
created_date timestamp default now(),
modified_date timestamp default now() on update now()
);