默认值为Timestamp列的错误1067,其中没有默认值

时间:2015-08-16 16:22:12

标签: mysql sql mysql-workbench

我在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;

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

3 个答案:

答案 0 :(得分:3)

来自MySQL文档:

  

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

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

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

答案 1 :(得分:0)

表的创建有效。

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

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

答案 2 :(得分:0)

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

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;