【问题标题】:Error when importing virtual column from MySQL to MariaDB将虚拟列从 MySQL 导入 MariaDB 时出错
【发布时间】:2021-06-16 19:11:06
【问题描述】:

我正在将数据库从 MySQL 移动到 MariaDB,并测试导出/导入。一个一致出现的问题是当表具有虚拟列时。 MySQL 中的 SHOW CREATE TABLE 返回:

CREATE TABLE `table1` (
  `colA` varchar(50) NOT NULL,
  `colB' varchar(50) NOT NULL,
  'vir1` GENERATED ALWAYS AS (concat_ws(' ', `colA`, `colB`)) VIRTUAL NOT NULL,
  `colC` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后MariaDB在导入的时候报错:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'NOT NULL,
  `colC` varchar(50) DEFAULT NULL

问题似乎出在虚拟列定义的“VIRTUAL NOT NULL”部分。如果我手动编辑导入 sql 文件,到此:

CREATE TABLE `table1` (
  `colA` varchar(50) NOT NULL,
  `colB' varchar(50) NOT NULL,
  'vir1` GENERATED ALWAYS AS (concat_ws(' ', `colA`, `colB`)) VIRTUAL,
  `colC` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后它导入就好了,所以我猜 MariaDB 不喜欢被告知虚拟字段是否允许为空(这似乎合乎逻辑,因为它不知道输入是否为空),但是导出的 MySQL 文件总是具有 VIRTUAL NULL 或 VIRTUAL NOT NULL 作为导出表定义的一部分。

有没有办法避免这种情况?我可以通过 grep 导出的文件来 s&r 这些定义,但这似乎很麻烦,如果这是与已知解决方案的兼容性问题,那么以后可能会遇到其他问题。

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    您展示的语法在 MySQL 中有效,我刚刚用 MySQL 5.7 进行了测试,它不会导致错误。

    MariaDB 语法不兼容。这已被报告为错误:https://jira.mariadb.org/browse/MDEV-10964

    您可以为该错误投票,甚至可以贡献一个补丁来解决它。

    归根结底,MariaDB 于 2010 年从 MySQL 分叉出来,从那时起,这两个产品之间的差距越来越大。它们不应再被视为兼容。

    就像您要从 MySQL 数据库迁移到 PostgreSQL 或 Microsoft SQL Server 一样,需要进行一些编辑才能使 MySQL 语法在不同品牌的 RDBMS 上工作。

    【讨论】:

    • 是的,在 MySQL 中有效,在 MariaDB 中无效。感谢错误的链接 - 我会给它投票(补丁肯定高于我的工资等级,并且由于它已经开放 4 年,它可能不被认为是严重的)。这也让我放心,这是一个特定的已知不兼容问题,而不是一个错误配置的过程。我将在导入 sql 之前添加一个过滤器,然后看看是否还有其他问题。感谢您的帮助!
    【解决方案2】:

    问题在于 null / not null 是 mysql 生成列定义的一部分,因此 mysqldump 将这些属性导出为转储表结构的一部分。这是正确的做法,因为 mysqldump 旨在与 mysql 一起使用,而不是与 mariadb 一起使用。

    您应该使用适当的 ETL 工具在不同的数据库产品之间迁移数据,即使这些产品之间的关系像 mysql 和 mariadb 一样密切。

    【讨论】:

    • 好点。我会谷歌一些迁移工具。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-01-14
    • 2020-10-17
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多