将 DATE 类型列的默认值设置为不带时间部分的当前日期?

问题描述 投票:0回答:7

注意:问题是关于 DATE 类型,而不是日期时间或时间戳

如何更改日期数据类型列以默认使用当前日期? 我看到了很多

datetime
(带时间部分)的例子,但没有看到日期的例子。我试过了:

ALTER TABLE `accounting` ALTER `accounting_date` 
  SET DEFAULT CURRENT_DATE;
ALTER TABLE `accounting` CHANGE `accounting_date` 
  `accounting_date` DATE NOT NULL DEFAULT CURRENT_DATE;

我也尝试过

CURDATE()
NOW()
CURRENT_DATE()
...

mysql constraints mysql-5.6
7个回答
12
投票

我使用版本8.0.26,这是工作:

datecolumn date DEFAULT (CURDATE())

如果不使用括号,它不起作用!


5
投票

MySQL 8.0+:

CREATE TABLE foo (
    `creation_time`     DATE DEFAULT (DATE_FORMAT(NOW(), '%Y-%m-%d'))
)

4
投票

您可能无法在 mysql 中设置“日期”数据类型的默认值。您需要将类型更改为时间戳或日期时间。

您可以看看这个类似的问题。

“日期”的默认值无效

编辑:

在5.6.5版本中,可以在日期时间列上设置默认值,甚至可以创建一个在行更新时更新的列。类型定义:

CREATE TABLE foo (
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)

参考:http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html


1
投票

如本问题中所述'create_date'时间戳字段的默认值无效,当MySQL处于

strict
模式时可能会发生此错误(我相信这是默认行为)。

如果您想覆盖它,只需在创建表时禁用所有这些检查即可:

SET SQL_MODE='ALLOW_INVALID_DATES';

仍然会生成警告,但它将允许创建表。


1
投票

它似乎可以在 sqlite 中工作:

"date" DATE NOT NULL DEFAULT (DATE(CURRENT_TIMESTAMP))

0
投票

不,你不能。文档对此非常清楚:

例如,这意味着您无法将日期列的默认值设置为 NOW() 或 CURRENT_DATE 等函数的值。例外情况是您可以指定 CURRENT_TIMESTAMP 作为 TIMESTAMP 和 DATETIME 列的默认值。


0
投票
我很惊讶没有人提到这一点。您可以使用

BEFORE INSERT

 触发器来设置日期列的默认值:

CREATE TRIGGER `my_schema`.`my_table_BEFORE_INSERT` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN IF NEW.date IS NULL THEN SET NEW.date = CURDATE(); END IF; END
    
© www.soinside.com 2019 - 2024. All rights reserved.