简要:
我遇到了奇怪的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不应该创建任何他没有被要求的东西。
有谁知道为什么要添加这些条款?
答案 0 :(得分:3)
正如Automatic Initialization and Updating for 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
。