将 DATE 类型列的默认值设置为没有时间部分的当前日期?
Setting default value for DATE type column to current date without time part?
注意:问题是关于 DATE 类型,而不是 Datetime 或 Timestamp
如何更改日期数据类型的列以默认使用当前日期?
我看到了很多关于 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 中为 'date' 数据类型设置默认值。您需要将类型更改为时间戳或日期时间。
你可以看看这个类似的问题。
Invalid default value for 'Date'
编辑:
在 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
如问题 Invalid default value for 'create_date' timestamp field 中所述,当 MySQL 处于 strict
模式(我相信这是默认行为)时,可能会发生此错误。
如果您想覆盖它,只需在创建 table:
时禁用所有这些检查
SET SQL_MODE='ALLOW_INVALID_DATES';
仍然会生成警告,但是它将允许创建 table。
MySQL 8.0+:
CREATE TABLE foo (
`creation_time` DATE DEFAULT (DATE_FORMAT(NOW(), '%Y-%m-%d'))
)
它似乎在 sqlite 中工作:
"date" DATE NOT NULL DEFAULT (DATE(CURRENT_TIMESTAMP))
我使用的是 8.0.26 版本,这是有效的:
datecolumn date DEFAULT (CURDATE())
不使用括号是不行的!
不,你不能。文档对此非常清楚:
这意味着,例如,您不能将日期列的默认值设置为 NOW() 或 CURRENT_DATE 等函数的值。例外情况是您可以将 CURRENT_TIMESTAMP 指定为 TIMESTAMP 和 DATETIME 列的默认值。
注意:问题是关于 DATE 类型,而不是 Datetime 或 Timestamp
如何更改日期数据类型的列以默认使用当前日期?
我看到了很多关于 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 中为 'date' 数据类型设置默认值。您需要将类型更改为时间戳或日期时间。
你可以看看这个类似的问题。
Invalid default value for 'Date'
编辑:
在 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
如问题 Invalid default value for 'create_date' timestamp field 中所述,当 MySQL 处于 strict
模式(我相信这是默认行为)时,可能会发生此错误。
如果您想覆盖它,只需在创建 table:
时禁用所有这些检查SET SQL_MODE='ALLOW_INVALID_DATES';
仍然会生成警告,但是它将允许创建 table。
MySQL 8.0+:
CREATE TABLE foo (
`creation_time` DATE DEFAULT (DATE_FORMAT(NOW(), '%Y-%m-%d'))
)
它似乎在 sqlite 中工作:
"date" DATE NOT NULL DEFAULT (DATE(CURRENT_TIMESTAMP))
我使用的是 8.0.26 版本,这是有效的:
datecolumn date DEFAULT (CURDATE())
不使用括号是不行的!
不,你不能。文档对此非常清楚:
这意味着,例如,您不能将日期列的默认值设置为 NOW() 或 CURRENT_DATE 等函数的值。例外情况是您可以将 CURRENT_TIMESTAMP 指定为 TIMESTAMP 和 DATETIME 列的默认值。