CURRENT_DATE/CURDATE() 不能作为默认 DATE 值工作
Posted
技术标签:
【中文标题】CURRENT_DATE/CURDATE() 不能作为默认 DATE 值工作【英文标题】:CURRENT_DATE/CURDATE() not working as default DATE value 【发布时间】:2013-12-25 23:54:21 【问题描述】:这里是一个非常直截了当的问题,我认为这应该有效,但它没有。为什么不呢?
CREATE TABLE INVOICE(
INVOICEDATE DATE NOT NULL DEFAULT CURRENT_DATE
)
【问题讨论】:
这个问题已经过时了。较新的版本允许这样做。有关版本号及其发布日期,请参阅我的答案。也就是说,更新可能是您的答案。 截至 2021 年 10 月,第 5 个答案是正确的。 【参考方案1】:因为不支持所以不能用
DEFAULT
子句指定列的默认值。除了一个例外,默认值必须是一个常量;它不能是函数或表达式。这意味着,例如,您不能将日期列的默认值设置为函数的值,例如NOW()
或CURRENT_DATE
。例外情况是您可以将CURRENT_TIMESTAMP
指定为TIMESTAMP
列的默认值
http://dev.mysql.com/doc/refman/5.5/en/create-table.html
【讨论】:
@inControl:是的,使用DATE_FORMAT
现在是 2016 年,老实说,这仍然适用的事实是荒谬的。我认为常量同义词的全部原因是允许它们出现在禁止非常量表达式的地方。
@NorthbornDesign 我通过迁移到 postgresql 为自己解决了这个问题 :-)
请注意@NorthbornDesign 的答案是正确的:)
对于change_date
列(更新和删除):CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html【参考方案2】:
根据这个documentation,从 MySQL 8.0.13 开始,你将可以指定:
CREATE TABLE INVOICE(
INVOICEDATE DATE DEFAULT (CURRENT_DATE)
)
MySQL 8.0.13 于 2018 年 10 月正式发布。发布信息位于 here。
【讨论】:
它对我有用,谢谢。 (看之前的mysql版本)。【参考方案3】:将您的日期列声明为 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 ;
【讨论】:
我必须将字段设置为NULL
才能完成这项工作,否则它会插入0000-00-00
。 MySQL v5.6.12。【参考方案4】:
目前从MySQL 8
,您可以将以下内容设置为DATE
列:
在MySQL Workbench
的列旁边的Default
字段中,写入:(curdate())
如果您只输入curdate()
,它将失败。您需要在开头和结尾添加额外的(
和)
。
【讨论】:
正确,需要注意的是额外的括号,非常感谢 这在 MySQL 8.0.21 中有效。奇怪的语法。谢谢! @NinoŠkopac 确实。那些奇怪的额外括号花费了我一整天的搜索时间。他们的官方文档在这方面根本不清楚。估计是小事^_^。很高兴它对你有用。 这应该被标记为正确答案。 Muchísimas gracias por tu solución!!【参考方案5】:create table the_easy_way(
capture_ts DATETIME DEFAULT CURRENT_TIMESTAMP,
capture_dt DATE AS (DATE(capture_ts))
)
(MySQL 5.7)
【讨论】:
【参考方案6】:我有当前最新版本的 MySQL:8.0.20
所以我的表名是访问,我的列名是curdate。
alter table visit modify curdate date not null default (current_date);
这会写入没有时间戳的默认日期值。
【讨论】:
我试过这个并且成功了。我认为这应该是公认的答案【参考方案7】:-- 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。
【讨论】:
【参考方案8】:正如其他答案正确指出的那样,您不能将动态函数用作默认值。您可以将 TIMESTAMP
与 CURRENT_TIMESTAMP
属性一起使用,但这并不总是可行的,例如,如果您想同时保留 creation 和 updated 时间戳,并且您第二个需要唯一允许的 TIMESTAMP
列。
在这种情况下,use a trigger instead。
【讨论】:
自动时间戳数量限制解除in MySQL 5.6。 感谢您的补充,我不知道这一点 - 仍然需要牢记,因为大多数虚拟主机仍处于 5.1 或 5.5。 MariaDB 10.2.1 允许DEFAULT(expression)
。见Create table。
你应该添加一个答案@RickJames【参考方案9】:
我带着同样的问题来到这个页面,但它对我有用!,只是想在这里更新,以后可能对某人有帮助!
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]>
【讨论】:
即使没有括号也为我工作DEFAULT LAST_DAY(CURDATE())
。一些 phpmyadmin 函数可能会触发错误以上是关于CURRENT_DATE/CURDATE() 不能作为默认 DATE 值工作的主要内容,如果未能解决你的问题,请参考以下文章