我想创建一个有OPENDATE
字段的表格。其默认值应早于系统日期的30天。
CREATE TABLE bugs (
ID INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
TITLE VARCHAR(20) NOT NULL,
SEVERITY INT NOT NULL check(SEVERITY>0 && SEVIRITY<5),
OPENDATE DATETIME NOT NULL DEFAULT ADDDATE(CURRENT_TIMESTAMP,-30),
CLOSEDATE DATETIME DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
这会在ADDDATE
函数处出错。我可以在创建表时使用函数吗?如果不是,解决方案是什么,如果是,为什么这不起作用?
我还注意到无法识别标识符CURRENT_DATE
。为什么呢?
答案 0 :(得分:1)
我是否可以在创建表时使用函数?
这是对的。您不能在表定义中使用函数。
您可以在表格中定义一个列:
insertdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
MySQL仅在此上下文中识别CURRENT_TIMESTAMP
,而不是CURRENT_DATE
或任何其他符号或函数。
然后,您可以在查询中执行类似的操作。
SELECT ... insertdate - INTERVAL 30 DAY opendate
或者,你甚至可以像这样定义一个opendate列:
opendate TIMESTAMP DEFAULT NULL
然后使用这样的查询模式:
SELECT ... WHEN opendate IS NULL
THEN insertdate - INTERVAL 30 DAY
ELSE opendate END opendate
如果你设置它,那将返回你的opendate
列,否则计算的opendate值。但是你需要非常仔细地制定你的业务规则。
答案 1 :(得分:0)
这是不可能的!请参阅MySQL官方文档中的以下说明:
数据类型规范中的
DEFAULT
value子句指示列的默认值。除了一个例外,默认值必须是常量;它不能是一个功能或表达。这意味着,例如,您无法将日期列的默认值设置为NOW()
或CURRENT_DATE
等函数的值。例外情况是,您可以将CURRENT_TIMESTAMP
指定为TIMESTAMP
和DATETIME
列的默认值。http://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html
您必须在软件方面控制列的默认值。在创建并使用某些数据初始化表后,您可以UPDATE
包含此类数据的列。