【问题标题】:Adding Generated Columns Crashes MariaDB添加生成的列会导致 MariaDB 崩溃
【发布时间】:2021-10-18 22:46:33
【问题描述】:

我遇到了一个奇怪的错误,生成的列和 MariaDB 在 Docker 容器中运行。

我使用的图片是mariadb:10

我一直在尝试添加生成的列。我添加的第一列效果很好;我添加的第二个会使容器崩溃并破坏表。

这是第一列有效:

ALTER TABLE program
    ADD is_current tinyint AS (
        IF (
            status IN ('active', 'suspended')
            AND start_date >= NOW(),
            1,
            0
        )
    );

这个很好用。以下 SQL 使容器崩溃:

ALTER TABLE program
    ADD is_covered tinyint AS (
        IF (
            status IN ('active', 'suspended')
            AND start_date <= NOW(),
            1,
            0
        )
    );

重启容器后出现如下错误:

SELECT * FROM program;

[42S02][1932] 表“my_local.program”被标记为崩溃,应该修复

repair table my_local.program;

引擎中不存在表“my_local.program”/操作失败

按照this question 的指示,我检查了容器中是否存在ibdata1 文件。它存在,表的.ibd.rfm 文件也存在。

我无法解决这个问题;我不得不删除表并重新创建它并重新导入数据。

如果有人有任何建议,我很乐意听到。

【问题讨论】:

  • 唯一的区别是 &lt;=&gt;=?
  • 来自mariadb documentation: "ALTER TABLE 语句对生成列的支持有限。... - 它不支持使用ADD 添加VIRTUAL 生成列如果 ALGORITHM 未设置为 COPY,则同一语句还添加其他列。有关更多信息,请参阅 MDEV-17468" - 这可能相关吗?
  • 编辑将 MySQL 更改为 MariaDB。 MariaDB 于 2010 年从 MySQL 分叉出来,从那时起它一直在实现自己的代码。您应该将 MariaDB 视为与 MySQL 不同的数据库产品。在每个版本中引入的这两种产品之间存在越来越多的不兼容性。
  • select version(); 显示什么?
  • @Barmar 是的,实际上我还想包含更多的逻辑,但在表格崩溃之前我没有做到这一点......

标签: docker mariadb generated-columns


【解决方案1】:

检查reference for MySQL 8 中生成的列我发现

文字、确定性内置函数和运算符是 允许。如果给定相同的数据,则函数是确定性的 表,多次调用产生相同的结果,独立于 连接的用户。非确定性函数示例 并失败此定义:CONNECTION_ID()、CURRENT_USER()、NOW()。

MySQL 5.7 也是如此。

当我尝试使用 MySQL 8 创建您生成的列时,我收到了以下消息:

错误代码:3763。生成的列“is_covered”的表达式包含不允许的函数:现在。

不过,我注意到您使用的是mariadb:10。尽管它源自 MySQL,但 MariaDB 现在实际上是一个不同的产品。

生成列的MariaDB reference 表示:(对于 10.2.1 及更高版本):

Non-deterministic built-in functions are supported in expressions for not indexed VIRTUAL generated columns. 

Non-deterministic built-in functions are not supported in expressions for PERSISTENT or indexed VIRTUAL generated columns.

因此,如果您有 MySQL,则根本无法做到这一点。如果您有 MariaDB 10.2.1+,您应该能够在某些限制下做到这一点。

在任何情况下,您都应该收到一条错误消息,而不是崩溃的表。我建议您查看 MariaDB bug reports,如果还没有,请提交一份。

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 2015-04-17
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多