当我尝试创建具有非空时间戳的表时,它要求我向其中添加默认时间戳或使用隐式默认值。但我不确定为什么这是必要的。
看看https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=c615bce0cd1009b0c597593e73fdd794,
其中以下 SQL
create table t3 (
id int not null,
d1 timestamp not null,
num double not null)
engine=innodb;
Run Code Online (Sandbox Code Playgroud)
将转变为
CREATE TABLE `t3` (
`id` int(11) NOT NULL,
`d1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`num` double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)
使用此类工具时,我们可以清楚地看到 int 和 double 不会自动为其生成默认值,但 timestamp 会自动生成默认值。为什么时间戳需要默认值,而另一个不需要默认值,这背后的原因是什么?
就我个人而言,我希望没有默认值,并且当最终用户将数据插入没有d1时间戳的行时,将引发异常,并且此类行将无法注入到表中。但显然这似乎并不是 MySQL 所采取的想法。