mysql / workbench:为什么在更新CURRENT_TIMESTAMP时添加了非空时间戳

时间:2013-01-16 10:42:58

标签: mysql attributes timestamp workbench

简要:

我遇到了奇怪的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;

使用 Export>创建上述脚本片段WorkBench中的正向工程SQL创建脚本 created_at 列在此处显示为siginifant。它是NOT 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

“更新current_timestamp”来自何处?我100%肯定我没有选择任何合适的选项,所以MySQL不应该创建任何他没有被要求的东西。

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

1 个答案:

答案 0 :(得分:3)

正如Automatic Initialization and Updating for TIMESTAMP所述:

  

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

     

[ deletia ]

     
      
  • 既不DEFAULT CURRENT_TIMESTAMP也不ON UPDATE CURRENT_TIMESTAMP,与指定DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP相同。
  •   
     

[ deletia ]

     

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

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

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

  •