当你声明一个列为“timestamp default CURRENT_TIMESTAMP”,然后不插入任何值时会发生什么?
在MySQL中,有一种数据类型叫做timestamp,它可以用来记录时间戳。在建表的时候,我们可以声明一个列为timestamp类型,并且设置默认值为CURRENT_TIMESTAMP,例如:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
上面的代码创建了一个名为test的表,其中有一个名为created_at的列,它的类型是timestamp,而且默认值为CURRENT_TIMESTAMP。我们可以发现,在建表的时候我们没有显式地插入任何值到created_at列中,那么会发生什么情况呢?
阅读更多:MySQL 教程
插入新行
当我们第一次向test表中插入一条新数据时,MySQL会自动将当前时间戳作为created_at列的默认值插入到该行中,例如:
INSERT INTO `test` (`id`) VALUES (1);
上面的代码向test表中插入了一条新数据,id为1,由于我们没有指定created_at列的值,所以MySQL会自动将当前时间戳插入到created_at列中。假设当前时间是2022年1月1日12点,那么test表中的数据如下:
+----+---------------------+
| id | created_at |
+----+---------------------+
| 1 | 2022-01-01 12:00:00 |
+----+---------------------+
我们可以发现,created_at列的值被自动设置为了当前时间戳,而且该值为日期时间格式的字符串。
更新已有行
如果我们想要更新test表中已有行的created_at列,该怎么办呢?实际上,我们可以像更新其他列一样,直接使用UPDATE语句来更新created_at列的值,例如:
UPDATE `test` SET `created_at` = '2022-02-01 12:00:00' WHERE `id` = 1;
上面的代码将test表中id为1的行的created_at列更新为2022年2月1日12点。此时,test表中的数据如下:
+----+---------------------+
| id | created_at |
+----+---------------------+
| 1 | 2022-02-01 12:00:00 |
+----+---------------------+
我们可以看到,created_at列的值被更新为指定的日期时间格式的字符串了。
当不插入任何值时发生什么?
当我们向test表插入新行时,如果没有插入created_at列的值,MySQL会自动将当前时间戳作为created_at列的默认值插入到该行中。但是,如果我们并不想插入默认值,而是想将该列的值设置为NULL,该怎么办呢?
我们可以使用INSERT语句,并且在insert语句中指定NULL值,例如:
INSERT INTO `test` (`id`, `created_at`) VALUES (2, NULL);
上面的代码向test表中插入了一条新数据,id为2,而created_at列的值被显式地设置为了NULL。此时,test表中的数据如下:
+----+---------------------+
| id | created_at |
+----+---------------------+
| 1 | 2022-02-01 12:00:00 |
+----+---------------------+
| 2 | NULL |
+----+---------------------+
我们可以看到,id为2的行的created_at列的值被设置为了NULL。
结论
当我们声明一个列为“timestamp default CURRENT_TIMESTAMP”,然后不插入任何值时,MySQL会自动将当前时间戳作为该列的默认值插入到该行中。如果我们插入该列的值为NULL,则需要在INSERT语句中显式地指定NULL值。如果想要更新该列的值,可以使用UPDATE语句来更新。在处理timestamp类型的数据时,我们需要注意该列的默认值为当前时间戳,而且该值为日期时间格式的字符串。