2016-07-28 66 views
0

我想创建一个表,其中有OPENDATE字段。系统日期前30天的默认值。我的SQL ADDDATE FUNCTION在CREATE TABLE中不工作

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. 这在功能提供了错误。我不能在创建表格时使用函数吗?如果不是,解决方案是什么,如果是,为什么这不起作用?

  2. 我还注意到标识符CURRENT_DATE未被识别。为什么?

回答

0

这是不可能的!请参阅官方MySQL文档中的以下说明:

数据类型规范中的DEFAULT值子句指示列的默认值。有一个例外,的默认值必须是常数;它不能是一个函数或表达式。这意味着,例如,您不能将日期列的默认值设置为函数的值,例如NOW()CURRENT_DATE。例外是,您可以指定CURRENT_TIMESTAMP作为TIMESTAMPDATETIME列的默认值。

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

你必须控制列对软件方面的默认值。在创建并使用一些数据初始化表格后,可以使用UPDATE列中的这些数据。

+0

@ sebastianbrosch-该线改变了工作吗?OPENDATE日期NOT NULL DEFAULT CURRENT_DATE – Prakash

+0

@ sebastianbrosch-抱歉,修改为DATATIME的数据类型和标识符CURRENT_TIMESTAMP,并得到这个工作。 – Prakash

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值。但你需要仔细研究你的业务规则。

+0

如果我将行更改为... OPENDATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - 这适用于行... OPENDATE DATE NOT NULL DEFAULT CURRENT_DATE - 不工作。根据http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html CURRENT_DATE标识符应该是有效的... – Prakash