我尝试用表达式更新生成的列。它在select
中起作用select from_unixtime(CONCAT(LEFT(jdoc->'$.ts', LENGTH(jdoc->'$.ts') - CHAR_LENGTH(jdoc->'$.sts')), jdoc->'$.sts')) as calc_ts
from table_name
但是当我修改表
时它不起作用alter table table_name
alter column sts_date set default from_unixtime(
CONCAT(LEFT(jdoc -> '$.ts', LENGTH(jdoc -> '$.ts') - CHAR_LENGTH(jdoc -> '$.sts')), jdoc -> '$.sts') /
1000);
返回错误:
[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from_unixtime( CONCAT(LEFT(jdoc -> '$.ts', LENGTH(jdoc -> '$.ts'' at line 2.
有什么不对的?
首先,MySQL 5.7不支持DEFAULT子句的表达式。该特性是MySQL 8.0.13的新特性。阅读这里:https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html如果你还在使用MySQL 5.7,你将不得不升级以获得此功能。
第二,表达式默认值需要额外的一对括号。
错:
DEFAULT expr
:
DEFAULT (expr)
注意语法参考显示了括号:
column_definition: {
data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)} ]
^ ^