【问题标题】:mysql/workbench: why is on update CURRENT_TIMESTAMP added for not null timestampmysql/workbench:为什么在更新 CURRENT_TIMESTAMP 中添加了非空时间戳
【发布时间】:2013-01-16 10:42:58
【问题描述】:

简介:

我遇到了奇怪的 MySQL 行为 - on update CURRENT_TIMESTAMP 属性正在添加,尽管我不想添加它。我想知道为什么会发生这种情况 - 是我使用的 MySQL 服务器还是 MySQL Workbench (v5.2.38) 的问题。

细节:

我已经使用 EER 图对数据库结构进行了建模,示例表如下:

CREATE  TABLE IF NOT EXISTS `privilege` (
  `id` INT NOT NULL ,
  `name` VARCHAR(64) NOT NULL COMMENT 'privilege name (just a label)' ,
  `created_at` TIMESTAMP NOT NULL COMMENT 'when the privilege was created' ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;

上面的脚本片段是使用WorkBench 中的Export > Forward Engineer SQL Create Script 创建的。 created_at 列在这里很重要。它不是 NULL,并且在定义记录时没有为时间戳定义默认值。所以我猜,如果有人试图在没有定义 created_at 的情况下插入记录,则会引发错误。

我在 MySQL 服务器中运行这个脚本来创建整个结构。并且创建的结构不同 - show create table privilege 返回以下内容:

CREATE TABLE `privilege` (
  `id` int(11) NOT NULL,
  `name` varchar(64) NOT NULL COMMENT 'privilege name (just a label)',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
  CURRENT_TIMESTAMP COMMENT 'when the privilege was created',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

“on update current_timestamp”从何而来?我 100% 确定我没有选择任何合适的选项,所以 MySQL 不应该创建任何他没有被要求的东西。

有人知道为什么要添加这些条款吗?

【问题讨论】:

    标签: mysql attributes timestamp workbench


    【解决方案1】:

    Automatic Initialization and Updating for TIMESTAMP 中所述:

    以下规则描述了在表中使用当前时间戳为默认值和自动更新值定义第一个 TIMESTAMP 列的可能性,对于一个但不是另一个,或者两者都不是:

    [ <em>deletia</em> ]

    • 既不指定DEFAULT CURRENT_TIMESTAMP 也不指定ON UPDATE CURRENT_TIMESTAMP,等同于指定DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP

    [ <em>deletia</em> ]

    要禁止第一个 TIMESTAMP 列的自动属性,请执行以下任一操作:

    • 使用指定常量默认值的DEFAULT 子句定义列。

    • 指定NULL 属性。这也会导致列允许NULL 值,这意味着您无法通过将列设置为NULL 来分配当前时间戳。分配NULL 会将列设置为NULL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多