实际上,我需要在表列之一中将当前月份的名称作为小写字符串作为默认值; 数据库表可能类似于:
name : john
joined : january
当我尝试使用mysql函数LOWER( MONTHNAME( NOW() ) )
作为默认值时,这给了我错误。
顺便说一句,我对创建触发器不感兴趣。
有任何魔术查询可以做到吗?
答案 0 :(得分:2)
从MySQL documentation:
除一个例外,将表达式默认值括在括号内,以将其与文字常量默认值区分开。
因此,以下方法应该起作用:
CREATE TABLE yourTable (
month_name VARCHAR(12) DEFAULT (LOWER(MONTHNAME(NOW())))
...
)
正如@Madhur所指出的那样,使用表达式作为默认值仅适用于MySQL 8及更高版本。
答案 1 :(得分:2)
如果使用MySQL 8.0或更高版本,则@TimBiegeleisen和@ fa06提供的答案应该可以解决问题。否则
... DEFAULT子句中指定的默认值必须是文字常量;它不能是函数或表达式。
查看documentation中的详细信息。
因此,对于以前的版本,您需要找到另一种方法。例如,您可以定义一个trigger,如果未指定该值,则为该列设置默认值:
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())));
有关建议的解决方案,另请参见live example。
答案 2 :(得分:0)
您可以在下面尝试
CREATE TABLE orderdata (
order_date DATE
, order_month VARCHAR(50) AS (lower(MONTHNAME(order_date)))
);