1

简短的:

我遇到了奇怪的 MySQL 行为 -虽然我不想添加它,但正在添加更新 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 不应该创建任何他没有被要求的东西。

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

4

1 回答 1

3

自动初始化和更新中所述TIMESTAMP

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

[ deletia ]

  • 没有DEFAULT CURRENT_TIMESTAMP也没有ON UPDATE CURRENT_TIMESTAMP,它与同时指定DEFAULT CURRENT_TIMESTAMP和相同ON UPDATE CURRENT_TIMESTAMP

[ deletia ]

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

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

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

于 2013-01-16T10:55:46.953 回答