我在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;
如何使用这些时间戳创建此表?
答案 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;