这里有一个非常直接的问题,我认为这个应该可以工作,但事实并非如此。为什么不行呢?
CREATE TABLE INVOICE(
INVOICEDATE DATE NOT NULL DEFAULT CURRENT_DATE
)
这里有一个非常直接的问题,我认为这个应该可以工作,但事实并非如此。为什么不行呢?
CREATE TABLE INVOICE(
INVOICEDATE DATE NOT NULL DEFAULT CURRENT_DATE
)
[编辑] 截至MySQL 8.0.13版本,已支持。请参见下方this answer。
它不起作用是因为不支持
DEFAULT
子句指定列的默认值。除一种情况外,默认值必须是常量;不能是函数或表达式。这意味着,例如,您不能将日期列的默认值设置为诸如NOW()
或CURRENT_DATE
之类的函数的值。例外是您可以将CURRENT_TIMESTAMP
指定为TIMESTAMP
列的默认值
DATE_FORMAT
。 - zerkmschange_date
列(更新和删除):CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html - Ralf Hundewadt从 MySQL 8
开始,可以将以下设置为 DATE
列:
在 MySQL Workbench
中,在列旁边的 Default
字段中写入:(curdate())
如果只写 curdate()
,会失败。你需要在开头和结尾加上额外的 (
和 )
。
将您的日期列声明为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.20。
因此,我的表名为visit,列名为curdate。
alter table visit modify curdate date not null default (current_date);
----- 2016-07-04 MariaDB 10.2.1 -- 发布说明 -- -----
支持 带有表达式的DEFAULT (MDEV-10134)。
----- 2018-10-22 8.0.13 一般可用性 -- -- -----
MySQL现在支持在数据类型规范中使用表达式作为默认值。这包括将表达式用作BLOB, TEXT, GEOMETRY和JSON数据类型的默认值,而这些数据类型以前根本不能被分配默认值。有关详细信息,请参见数据类型默认值。
CURRENT_TIMESTAMP
属性的TIMESTAMP
,但这并非总是可能的,例如如果您想保留创建和更新时间戳,并且您需要第二个允许的TIMESTAMP
列。
在这种情况下,请改用触发器。
我也曾经有同样的问题,但是这个方法对我很有效!我来更新一下,或许以后会对别人有帮助!
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功能可能会触发错误。 - HebeCURRENT_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)
);