我的SQL ADDDATE FUNCTION在CREATE TABLE中不起作用

时间:2016-07-28 10:32:31

标签: mysql

我想创建一个有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;
  1. 这会在ADDDATE函数处出错。我可以在创建表时使用函数吗?如果不是,解决方案是什么,如果是,为什么这不起作用?

  2. 我还注意到无法识别标识符CURRENT_DATE。为什么呢?

2 个答案:

答案 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指定为TIMESTAMPDATETIME列的默认值。

     

http://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html

您必须在软件方面控制列的默认值。在创建并使用某些数据初始化表后,您可以UPDATE包含此类数据的列。