这里非常直截了当的问题,我认为这应该有效,但事实并非如此。为什么不呢?
CREATE TABLE INVOICE(
INVOICEDATE DATE NOT NULL DEFAULT CURRENT_DATE
)
答案 0 :(得分:51)
它不起作用,因为它不受支持
DEFAULT
子句指定列的默认值。除了一个例外,默认值必须是常量;它不能是一个功能或表达。这意味着,例如,您无法将日期列的默认值设置为NOW()
或CURRENT_DATE
等函数的值。例外情况是您可以指定CURRENT_TIMESTAMP
作为TIMESTAMP
列的默认值
答案 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)
正如另一个答案正确指出的那样,您不能将动态函数用作默认值。您可以将TIMESTAMP
与CURRENT_TIMESTAMP
属性一起使用,但这并非总是可行,例如,如果您要同时保留创建和更新时间戳,您需要第二个唯一允许的TIMESTAMP
列。
在这种情况下,use a trigger instead。
答案 5 :(得分:1)
----- 2016-07-04 MariaDB 10.2.1-发行说明------
支持DEFAULT with expressions(MDEV-10134)。
----- 2018-10-22 8.0.13一般可用性-------
MySQL现在支持使用表达式作为数据类型规范中的默认值。这包括将表达式用作BLOB,TEXT,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以获得最新更新。