注意:问题是关于 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()
...
我使用版本8.0.26,这是工作:
datecolumn date DEFAULT (CURDATE())
如果不使用括号,它不起作用!
MySQL 8.0+:
CREATE TABLE foo (
`creation_time` DATE DEFAULT (DATE_FORMAT(NOW(), '%Y-%m-%d'))
)
您可能无法在 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
如本问题中所述'create_date'时间戳字段的默认值无效,当MySQL处于
strict
模式时可能会发生此错误(我相信这是默认行为)。
如果您想覆盖它,只需在创建表时禁用所有这些检查即可:
SET SQL_MODE='ALLOW_INVALID_DATES';
仍然会生成警告,但它将允许创建表。
它似乎可以在 sqlite 中工作:
"date" DATE NOT NULL DEFAULT (DATE(CURRENT_TIMESTAMP))
不,你不能。文档对此非常清楚:
例如,这意味着您无法将日期列的默认值设置为 NOW() 或 CURRENT_DATE 等函数的值。例外情况是您可以指定 CURRENT_TIMESTAMP 作为 TIMESTAMP 和 DATETIME 列的默认值。
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