【问题标题】:MySQL 8.0 Generated Columns ProblemsMySQL 8.0 生成列问题
【发布时间】:2020-08-16 23:39:37
【问题描述】:

我正在将 Access 2016 后端数据库升级到 MySQL 8.0,但生成的列出现问题。我使用第三方工具将我的 Access 表迁移到 MySQL,并且大部分工作正常。不会迁移 Access 计算列。或者更确切地说,它们是标准列。我需要进去重新定义 MySQL 中的计算。

在 Access 中,我有一个标题列,它将标题、姓氏、名字、配偶姓名、配偶姓氏组合成一个标题。这是访问计算,它工作得很好。

IIf([UseTitle],[Title] & " ","") & IIf(IsNull([DonorFirstName]),[DonorLastName],[DonorFirstName] & IIf(IsNull([SpouseName])," " & [DonorLastName],IIf(IsNull([SpouseLastName])," and " & [SpouseName] & " " & [DonorLastName]," " & [DonorLastName] & " and " & [SpouseName] & " " & [SpouseLastName])))

如果此人想要使用标题(例如“Mr. & Mrs.”),请插入标题。如果没有名字,则姓氏是公司,因此添加 LastName 字段,否则添加 FirstName 字段。如果没有配偶,请添加空格和姓氏字段。如果配偶同姓,加“和”加SpouseLastName。否则,添加 LastName 加 " 和 " 加 SpouseFirstName 加空格加 SpouseLastName。所以现在你要么有“Mr. & Mrs. John and Jane Doe”或“Mr. & Mrs. John Doe and Jane Smith”。

我尝试在 MySQL 中使用这样的 CONCAT 和 IF 组合来执行此操作:

`Heading` varchar(509) CHARACTER SET utf8 COLLATE utf8_general_ci GENERATED ALWAYS AS (concat(if(((`UseTitle` = 0) or (`Title` is null)),_utf8mb3'',concat(`Title`,_utf8mb3' ')),if((ifnull(`DonorFirstName`,_utf8mb3'') = _utf8mb3''),`DonorLastName`,concat(`DonorFirstName`,_utf8mb3' ',if((ifnull(`SpouseName`,_utf8mb3'') = _utf8mb3''),`DonorLastName`,if((ifnull(`SpouseLastName`,_utf8mb3'') = _utf8mb3''),concat(_utf8mb3'and ',`SpouseName`,_utf8mb3' ',`DonorLastName`),concat(`DonorLastName`,_utf8mb3' and ',`SpouseName`,_utf8mb3' ',`SpouseLastName`))))))) STORED,

这不起作用,实际上会导致 DDL 表中的错误。它似乎可以正确更新,但是当我尝试在 MySQL Workbench 中打开表设计时,它给了我一个错误提示 Error parsing DDL for tableName

当我选择在另一个选项卡中查看 DDL 时,生成的字段行用星号标识,并显示如下:

`Heading` varchar(509) CHARACTER SET utf8 COLLATE utf8_general_ci GENERATED ALWAYS AS (concat(if(((`UseTitle` = 0) or (`Title` is null)),_utf8mb3'',concat(`Title`,_utf8mb3' ')), `DonorFirstName`,_utf8mb3' ',`DonorLastName`)) VIRTUAL,

_utf8mb3 后面的 '' 有下划线,悬停在上面显示:

"Syntax error: extraneous input found - expected 'comma'"

幸运的是,这是一个全新的数据库,我可以简单地删除并重新创建表,但如果我不知道如何正确生成该列,则不能。

我显然在这里做错了什么。有没有正确的方法让这个生成的列正常工作?

【问题讨论】:

  • 请提供您的完整表格,尤其是所需的列
  • 请显示show create table yourtablename的输出
  • 我测试了你的 Heading 并且 mysql 8.0.,21 根本没有显示任何问题,它永远显示 _utf8mb3 警告。
  • show create table 为该列提供与上述相同的信息。 _utf8mb3 会自动放入其中。我的在 DDL 的左边距显示大 X,所以这绝对是一个错误,而不是警告。
  • 请告知我被否决的原因。我费了很多力气来简明扼要地陈述问题并举例说明问题。我做错了什么?

标签: mysql ms-access generated-columns


【解决方案1】:

您的 alter table 命令不正确。一个有效的命令看起来像这样。删除所有 _utf8mb3 并更正 ifconcat 原生函数。

ALTER TABLE tableName
`Heading` varchar(509) CHARACTER SET utf8 COLLATE utf8_general_ci GENERATED ALWAYS AS (
    concat(
        if( ((not `UseTitle`) or IsNull(`Title`)),
            '',
            concat(`Title`,' ', `DonorFirstName`, ' ',`DonorLastName`)
        )
    )
) VIRTUAL,

PS:如果函数内的any值为null,concat(value1, value2)将返回null。

concat_ws('', value1, value2) 将忽略空值并添加所有非空值。

【讨论】:

  • 谢谢克里希。我的和你的一样,只是我放的是(UseTitle=0)而不是(不是UseTitle)。有些括号是不同的,所以我修复了所有这些。但是_utf8mb3都是在我执行DDL后自动添加的。我正在使用 create table 而不是 alter table。然后新表损坏什么的,因为我无法在设计模式下打开它。
【解决方案2】:

感谢那些回答或评论的人。 如果我在 SQL 编辑器中进行更改,它就可以正常工作。更改按预期被接受。尽管如此,我在尝试在 MySQL Workbench 中查看表定义时遇到了一个严重错误。所以,问题似乎就在那里。我将重新发布问题以解决该问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2021-10-20
    相关资源
    最近更新 更多