实际上,我需要当前月份名称作为小写字符串作为表列中的默认值;db表可能如下所示:
name : john joined : january
当我尝试使用mysql函数时 LOWER( MONTHNAME( NOW() ) ) 作为默认值,这给了我错误。顺便说一句,我对创建触发器不感兴趣。有什么神奇的疑问吗?
LOWER( MONTHNAME( NOW() ) )
ivqmmu1c1#
从mysql文档:除了一个例外,将表达式默认值括在括号内,以区别于文本常量默认值。因此,以下方法应该有效:
CREATE TABLE yourTable ( month_name VARCHAR(12) DEFAULT (LOWER(MONTHNAME(NOW()))) ... )
正如@madhur所指出的,使用表达式作为默认值只能从mysql 8开始使用。
nwo49xxi2#
如果您使用mysql 8.0或更高版本,那么@timbiegeleisen和@fa06提供的答案应该可以解决这个问题。否则... default子句中指定的默认值必须是文字常量;它不能是函数或表达式。请参阅文档中的详细信息。因此,对于以前的版本,您需要找到另一种方法。例如,可以定义一个触发器,在未指定值的情况下为列设置默认值:
CREATE TABLE MyTable ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), joined VARCHAR(12) ); CREATE TRIGGER defaultMonth BEFORE INSERT ON MyTable FOR EACH ROW SET NEW.joined = IFNULL(NEW.joined, LOWER(MONTHNAME(NOW())));
有关建议的解决方案,请参见示例。
omqzjyyz3#
你可以在下面试试
CREATE TABLE orderdata ( order_date DATE , order_month VARCHAR(50) AS (lower(MONTHNAME(order_date))) );
3条答案
按热度按时间ivqmmu1c1#
从mysql文档:
除了一个例外,将表达式默认值括在括号内,以区别于文本常量默认值。
因此,以下方法应该有效:
正如@madhur所指出的,使用表达式作为默认值只能从mysql 8开始使用。
nwo49xxi2#
如果您使用mysql 8.0或更高版本,那么@timbiegeleisen和@fa06提供的答案应该可以解决这个问题。否则
... default子句中指定的默认值必须是文字常量;它不能是函数或表达式。
请参阅文档中的详细信息。
因此,对于以前的版本,您需要找到另一种方法。例如,可以定义一个触发器,在未指定值的情况下为列设置默认值:
有关建议的解决方案,请参见示例。
omqzjyyz3#
你可以在下面试试