【问题标题】:Error 1067 for Default of Timestamp column where there is no Default没有默认值的时间戳列的默认值错误 1067
【发布时间】:2015-08-16 16:22:11
【问题描述】:

我在 MySQL 5.5 中填充模式时遇到问题。每个表都有一个“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;

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

【问题讨论】:

    标签: mysql sql mysql-workbench


    【解决方案1】:

    来自 MySQL 文档:

    从 MySQL 5.6.5 开始,TIMESTAMP 和 DATETIME 列可以自动初始化并更新为当前日期和时间(即当前时间戳)。在 5.6.5 之前,这仅适用于 TIMESTAMP,并且每个表最多有一个 TIMESTAMP 列。以下说明首先描述 MySQL 5.6.5 及更高版本的自动初始化和更新,然后描述 5.6.5 之前版本的差异。

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

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

    【讨论】:

    • 为了帮助我理解,Not Null 字段是否存在隐式默认值?
    • 存在一个隐式默认值,因为它们必须在插入时进行初始化,但不会返回您希望从这些属性中获得的默认值,因为您只能保证每个文档生成 1 个 TIMESTAMP。
    • 实际上,我删除了 Not Null 要求并收到相同的错误。我假设即使 null 也算作时间戳初始化。我想我需要删除其中一列。
    • 我的最终解决方案是改用 DateTime 字段。
    【解决方案2】:

    表的创建工作。

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

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

    【讨论】:

      【解决方案3】:

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

      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;
      

      【讨论】:

      • 不,抱歉 - "#1067 - 'create_time' 的默认值无效"
      • @JohnWojtk 试试CURRENT_TIMESTAMP ,看看我的编辑。祝你好运!
      • 这会打开另一个蠕虫:“#1293 - 表定义不正确;在 DEFAULT 或 ON UPDATE 子句中只能有一个带有 CURRENT_TIMESTAMP 的 TIMESTAMP 列”。我已经为此工作了几个小时:)
      • 见@andrewdleach 答案。
      • @JohnWojtk 请尝试以下操作:`update_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2020-12-01
      • 2014-12-07
      • 1970-01-01
      相关资源
      最近更新 更多