CURRENT_DATE/CURDATE()不作为默认 DATE 值工作

很直接的问题,我觉得这个应该有用,但是没用,为什么没用?

CREATE TABLE INVOICE(
INVOICEDATE DATE NOT NULL DEFAULT CURRENT_DATE
)
157473 次浏览

它不工作是因为它没有得到支持

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

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

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

在这种情况下,用触发器代替

将日期列声明为 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 ;
create table the_easy_way(
capture_ts DATETIME DEFAULT CURRENT_TIMESTAMP,
capture_dt DATE AS (DATE(capture_ts))
)

(MySQL 5.7)

根据这个 文件,从 MySQL 8.0.13开始,您将能够指定:

CREATE TABLE INVOICE(
INVOICEDATE DATE DEFAULT (CURRENT_DATE)
)

MySQL 8.0.13于2018年10月发布,发布信息位于 给你

——2016-07-04 MariaDB 10.2.1——发布说明——

支援 表达式的默认值(MDEV-10134)。

——2018-10-228.0.13一般可用性————

MySQL 现在支持在数据类型规范中使用表达式作为默认值。这包括使用表达式作为 一团短信、 GEOMETRY 和 JSON数据类型的默认值,这些数据类型以前根本不能分配默认值。有关详细信息,请参阅 数据类型默认值

我带着同样的问题来到这一页,但它对我起作用了!,只是想在这里更新一下,以后可能对某人有帮助! !

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]>

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

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

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

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

因此,我的表名称是参观,我的列名称是 curdate。

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

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

创建表时,必须使用 CURRENT_DATE()函数作为默认值。

CREATE TABLE SALES_DATA (
SALES_ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
SALES_GIRL_ID INT UNSIGNED NOT NULL,
SALES_DATE DATE NOT NULL DEFAULT (CURRENT_DATE()),
TOTAL_SALES FLOAT(6, 2),
PRIMARY KEY (SALES_ID),
FOREIGN KEY (SALES_GIRL_ID) REFERENCES SALES_GIRLS(ID)
);