【发布时间】: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