没有默认值的时间戳列的默认值错误 1067

Error 1067 for Default of Timestamp column where there is no Default

我在 MySQL 5.5 中填充模式时遇到问题。每个 table 都有一个 "create_time" 和 "update_time",它们是时间戳。我更喜欢这些列没有默认值,但即使没有默认值,我也会收到引用默认值的 1067 错误。

#1067 - Invalid default value for 'update_time' 

下面是我的脚本的一部分,它是由 MySQL Workbench 生成的。

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

CREATE SCHEMA IF NOT EXISTS `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `database` ;

CREATE TABLE IF NOT EXISTS `database`.`table` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `create_time` TIMESTAMP NOT NULL,
  `update_time` TIMESTAMP NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC))
ENGINE = InnoDB;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

如何使用这些时间戳创建此 table?

来自 MySQL 文档:

As of MySQL 5.6.5, TIMESTAMP and DATETIME columns can be automatically initializated and updated to the current date and time (that is, the current timestamp). Before 5.6.5, this is true only for TIMESTAMP, and for at most one TIMESTAMP column per table. The following notes first describe automatic initialization and updating for MySQL 5.6.5 and up, then the differences for versions preceding 5.6.5.

由于您使用的是 5.5 并尝试使用 TIMESTAMP 数据类型设置两个属性,因此只能保证一个属性设置默认值。

这是有道理的,因为 update 列抛出错误,第二个要初始化的属性,不允许根据文档生成默认 TIMESTAMP。

创作table作品。

但是,如果您插入一条记录,则需要为 update_time 设置一个值,因为 null 值是不允许的。

否则会抛出错误,因为没有可以插入的默认值。

为您的时间戳添加默认值:

CREATE TABLE IF NOT EXISTS `database`.`table` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC))
ENGINE = InnoDB;