CURRENT_DATE/CURDATE()不能用作默认的DATE值

inC*_*rol 33 mysql date default-value

这里非常直截了当的问题,我认为这应该有效,但事实并非如此.为什么不呢?

CREATE TABLE INVOICE(
   INVOICEDATE DATE NOT NULL DEFAULT CURRENT_DATE
)
Run Code Online (Sandbox Code Playgroud)

zer*_*kms 55

它不起作用,因为它不受支持

DEFAULT子句指定列的默认值.除了一个例外,默认值必须是常量; 它不能是一个功能或表达.这意味着,例如,您不能将日期列的默认值设置为函数的值,例如NOW()CURRENT_DATE.例外情况是您可以指定列CURRENT_TIMESTAMP的默认值TIMESTAMP

http://dev.mysql.com/doc/refman/5.5/en/create-table.html

  • 这是2016年,老实说,事实仍然如此,这是荒谬的.我认为不变同义词的全部原因是允许它们在非常常表达的地方被禁止. (21认同)
  • @NorthbornDesign我通过迁移到postgresql为自己解决了:-) (5认同)

小智 22

将您的日期列声明为NOT NULL,但没有默认值.然后添加此触发器:

USE `ddb`;
DELIMITER $$
CREATE TRIGGER `default_date` BEFORE INSERT ON `dtable` FOR EACH ROW
if ( isnull(new.query_date) ) then
 set new.query_date=curdate();
end if;
$$
delimiter ;
Run Code Online (Sandbox Code Playgroud)


Amo*_*ong 21

根据此文档,从 MySQL 8.0.13 开始,您将能够指定:

CREATE TABLE INVOICE(
    INVOICEDATE DATE DEFAULT (CURRENT_DATE)
)
Run Code Online (Sandbox Code Playgroud)

不幸的是,截至今天,该版本尚未发布。您可以在此处查看最新更新。

  • 它对我来说就是这样,谢谢。(查看之前的mysql版本)。 (3认同)

小智 12

create table the_easy_way(
  capture_ts DATETIME DEFAULT CURRENT_TIMESTAMP,
  capture_dt DATE AS (DATE(capture_ts))
)
Run Code Online (Sandbox Code Playgroud)

(MySQL 5.7)


t1f*_*t1f 12

目前,MySQL 8您可以将以下内容设置为一DATE列:

在 中MySQL Workbench,在Default列旁边的字段中,写下:(curdate())

如果你只是curdate()它会失败。在开始和结束时,您需要额外的()

  • 正确,重要的是要注意额外的括号,非常感谢 (3认同)

awo*_*man 10

我有当前最新版本的MySQL:8.0.20

所以我的表名是visit,我的列名是curdate。

alter table visit modify curdate date not null default (current_date);
Run Code Online (Sandbox Code Playgroud)

这将写入不带时间戳的默认日期值。