在MySQL中,我们可否针对具有时间戳默认值的列使用current_date()?

在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(),因为时间戳和日期类型并不等价。时间戳更加精确,包含了日期和时间信息。而日期类型只包含日期信息。因此,在插入数据时,我们需要使用合适的函数来设置具有时间戳默认值的列。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程