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

时间:2013-12-09 00:18:10

标签: mysql date default-value

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

CREATE TABLE INVOICE(
   INVOICEDATE DATE NOT NULL DEFAULT CURRENT_DATE
)

9 个答案:

答案 0 :(得分:51)

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

  

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

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

答案 1 :(得分:21)

将您的日期列声明为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 ;

答案 2 :(得分:5)

当前从MySQL 8您可以将以下内容设置到DATE列:

MySQL Workbench的该列旁边的Default字段中,输入:(curdate())

如果仅放置curdate(),它将失败。您需要在开头和结尾处添加额外的()

答案 3 :(得分:4)

create table the_easy_way(
  capture_ts DATETIME DEFAULT CURRENT_TIMESTAMP,
  capture_dt DATE AS (DATE(capture_ts))
)

(MySQL 5.7)

答案 4 :(得分:2)

正如另一个答案正确指出的那样,您不能将动态函数用作默认值。您可以将TIMESTAMPCURRENT_TIMESTAMP属性一起使用,但这并非总是可行,例如,如果您要同时保留创建更新时间戳,您需要第二个唯一允许的TIMESTAMP列。

在这种情况下,use a trigger instead

答案 5 :(得分:1)

----- 2016-07-04 MariaDB 10.2.1-发行说明------

支持DEFAULT with expressionsMDEV-10134)。

----- 2018-10-22 8.0.13一般可用性-------

MySQL现在支持使用表达式作为数据类型规范中的默认值。这包括将表达式用作BLOBTEXT,GEOMETRY和JSON数据类型的默认值,以前根本无法为其分配默认值。有关详细信息,请参见Data Type Default Values

答案 6 :(得分:1)

我来到此页面时也想到了同样的问题,但是它对我有用!,只是想在此处进行更新,可能对以后的某个人有用!

MariaDB [niffdb]> desc invoice;
+---------+--------+------+-----+---------+----------------+
| Field   | Type   | Null | Key | Default | Extra          |
+---------+--------+------+-----+---------+----------------+
| inv_id  | int(4) | NO   | PRI | NULL    | auto_increment |
| cust_id | int(4) | NO   | MUL | NULL    |                |
| inv_dt  | date   | NO   |     | NULL    |                |
| smen_id | int(4) | NO   | MUL | NULL    |                |
+---------+--------+------+-----+---------+----------------+
4 rows in set (0.003 sec)

MariaDB [niffdb]> ALTER TABLE invoice MODIFY inv_dt DATE NOT NULL DEFAULT (CURRENT_DATE);
Query OK, 0 rows affected (0.003 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [niffdb]> desc invoice;
+---------+--------+------+-----+-----------+----------------+
| Field   | Type   | Null | Key | Default   | Extra          |
+---------+--------+------+-----+-----------+----------------+
| inv_id  | int(4) | NO   | PRI | NULL      | auto_increment |
| cust_id | int(4) | NO   | MUL | NULL      |                |
| inv_dt  | date   | NO   |     | curdate() |                |
| smen_id | int(4) | NO   | MUL | NULL      |                |
+---------+--------+------+-----+-----------+----------------+
4 rows in set (0.002 sec)

MariaDB [niffdb]> SELECT VERSION();
+---------------------------+
| VERSION()                 |
+---------------------------+
| 10.3.18-MariaDB-0+deb10u1 |
+---------------------------+
1 row in set (0.010 sec)

MariaDB [niffdb]>

答案 7 :(得分:1)

我拥有最新的MySQL版本:8.0.20

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

alter table visit modify curdate date not null default (current_date);

这将写入没有时间戳的默认日期值。

答案 8 :(得分:0)

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

CREATE TABLE INVOICE(
    INVOICEDATE DATE DEFAULT (CURRENT_DATE)
)

很遗憾,截至今天,该版本尚未发布。您可以检查here以获得最新更新。