【问题标题】:Mysql 8: alter table ... alter column ... set default with an expression results in syntax errorMysql 8:alter table ... alter column ... 使用表达式设置默认值导致语法错误
【发布时间】:2022-01-27 12:58:06
【问题描述】:

我的环境

Mysql 8.0.25

我想做什么

我想使用alter column 子句为我的日期时间列设置默认值

Mysql 8 文档说set default 之后是literalexpression https://dev.mysql.com/doc/refman/8.0/en/alter-table.html

...
| ALTER [COLUMN] col_name {
        SET DEFAULT {literal | (expr)}
      | SET {VISIBLE | INVISIBLE}
      | DROP DEFAULT
    }

我尝试了什么

所以我做了下面的事情,但没有一个成功。

alter table my_table alter column my_datetime_column set default CURRENT_TIMESTAMP();
alter table my_table alter column my_datetime_column set default NOW();
alter table my_table alter column my_datetime_column set default CURRENT_TIMESTAMP;
alter table my_table alter column my_datetime_column set default NOW;

问题

我知道我可以通过change column 子句设置默认值。但为什么不使用alter column? 我对文档有什么误解吗?

【问题讨论】:

    标签: mysql alter-table


    【解决方案1】:

    这似乎是 MySQL 解析器中的一个奇怪的差距。

    多年来,MySQL 列默认值被要求为文字标量值,否则为 NULL。不支持表达式。

    MySQL 8.0 还支持默认使用表达式的选项,但表达式在括号中是必需的语法。

    CREATE TABLE MyTable (
      a INT,
      b INT,
      c INT DEFAULT a+b,  -- ERROR
      d INT DEFAULT (a+b) -- CORRECT
    );
    

    MySQL 时间戳/日期时间列具有从早期版本开始支持的特殊语法,允许使用关键字 CURRENT_TIMESTAMP 而不是文字值。不需要括号。见https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html

    但这似乎不受ALTER TABLE...ALTER COLUMN 声明的支持:

    alter table mytable alter column dt set default current_timestamp;
    
    ERROR 1064 (42000): 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 'current_timestamp' at line 1
    

    但是,如果您使用 MySQL 8.0,则可以使用 CURRENT_TIMESTAMP,前提是您遵循较新的表达式默认语法,并将其放在括号中:

    alter table mytable alter column dt set default (current_timestamp);
    
    Query OK, 0 rows affected (0.01 sec)
    

    您也可以使用不带括号的传统语法,但不能使用ALTER COLUMN。您必须使用MODIFY COLUMN 的语法,这需要您指定列的数据类型和可空性。

    alter table mytable modify column dt datetime not null default current_timestamp;
    
    Query OK, 0 rows affected (0.01 sec)
    

    这只是 SQL 解析器中的一个奇怪的不一致。默认情况下对CURRENT_TIMESTAMP 的特殊支持未扩展到ALTER COLUMN 子句。这已被报告为错误,但被拒绝:https://bugs.mysql.com/bug.php?id=31452

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多