在MySQL中,我们可否针对具有时间戳默认值的列使用current_date()?
阅读更多:MySQL 教程
背景
在MySQL中,我们可以给数据表的某些列设置默认值,以确保在插入新数据时不必手动设置这些列的值。例如,我们可以为时间戳列设置默认值为当前时刻,以记录数据的最近更新时间。
而current_date()是MySQL系统函数之一,可返回当前日期值。那么问题来了,在MySQL中,我们可否针对具有时间戳默认值的列使用current_date()呢?
实验
为了解决上述问题,我们可以创建一张测试表。下面是创建表的DDL语句:
CREATE TABLE test (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
d DATE DEFAULT CURRENT_DATE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上述DDL语句创建了一张名为test的表,该表包含四列:id、name、ts和d。其中,id、name分别为表的主键和非空列,ts为时间戳类型的列,并设置其默认值为当前时间戳,d为日期类型的列,并设置其默认值为当前日期。
为了插入新数据到test表,我们可以使用如下的INSERT语句:
INSERT INTO test (name) VALUES ('John Doe');
此时,MySQL会自动设置ts列的值为当前时间戳,d列的值为当前日期。
接下来,我们可以使用如下的SELECT语句查询插入的数据:
SELECT * FROM test;
MySQL系统正确地为ts和d列设置了默认值。
接下来,我们需要验证是否可以在INSERT语句中直接使用current_date()来设置具有日期默认值的列d:
INSERT INTO test (name, d) VALUES ('Jane Doe', CURRENT_DATE());
此时,MySQL会使用当前日期设置d列的值,并且插入成功。
接下来,我们需要测试是否可以在INSERT语句中直接使用current_date()来设置具有时间戳默认值的列ts:
INSERT INTO test (name, ts) VALUES ('Sam Smith', CURRENT_DATE());
此时,MySQL会报错,错误信息如下:
ERROR 1292 (22007): Incorrect datetime value: '2021-06-15' for column 'ts' at row 1
简单来说,就是current_date()返回的是日期类型的值,不能直接用于时间戳列ts。
结论
在MySQL中,不能针对具有时间戳默认值的列使用current_date(),因为时间戳和日期类型并不等价。时间戳更加精确,包含了日期和时间信息。而日期类型只包含日期信息。因此,在插入数据时,我们需要使用合适的函数来设置具有时间戳默认值的列。