【问题标题】:Error [42000][1064] for generated virtual column生成的虚拟列的错误 [42000][1064]
【发布时间】:2022-12-16 23:39:47
【问题描述】:

我尝试用表达式更新生成的列。它适用于选择

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 mysql-5.7


    【解决方案1】:

    首先,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)
    

    注意 syntax reference 显示括号:

    column_definition: {
        data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)} ]
                                                        ^    ^
    

    【讨论】:

    • 它没有帮助。但我可以创建一个新专栏
    • 在我写下答案之前,我实际上测试了你的代码,它确实有效。
    • mysql 5.7 [HY000][1221] DEFAULT 和生成列的使用不正确。
    • 请参阅上面的编辑。
    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 2011-12-06
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多