MySQL 8.0生成的列问题

MySQL 8.0生成的列问题,mysql,ms-access,generated-columns,Mysql,Ms Access,Generated Columns,我正在将Access 2016后端数据库升级到MySQL 8.0,生成的列有问题。我使用第三方工具将我的访问表迁移到MySQL,在大多数情况下,它运行良好。不迁移Access计算列。或者更确切地说,它们是,但作为标准列。我需要在MySQL中重新定义计算 在Access中,我有一个标题列,它将标题、姓氏、名、配偶姓名、配偶姓氏组合成一个标题。这里是访问计算,它工作得很好 IIf([UseTitle],[Title] & " ","") & I

我正在将Access 2016后端数据库升级到MySQL 8.0,生成的列有问题。我使用第三方工具将我的访问表迁移到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])))
如果此人希望使用标题(如“先生和夫人”),请插入标题。如果没有名字,则姓氏是公司,因此添加LastName字段,否则添加FirstName字段。如果没有配偶,请添加空格和姓氏字段。如果配偶姓氏相同,则添加“和”以及配偶姓氏。否则,添加LastName加上“和”加上spoosefirstname加上空格加上spooselastname。所以现在你要么有“约翰夫妇和简·多伊”要么有“约翰·多伊夫妇和简·史密斯”

我尝试在MySQL中使用Concat和IFs的组合来实现这一点,如下所示:

`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'"
幸运的是,这是一个全新的数据库,我可以简单地删除并重新创建该表,但如果我无法正确地生成该列,就不能这样做


我显然做错了什么。是否有正确的方法使生成的列正常工作?

您的alter table命令不正确。一个有效的命令如下所示。删除所有
\u utf8mb3
并更正
if
concat
本机函数

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:
concat(value1,value2)
如果函数中的任何值为null,则将返回null


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

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

请提供完整的表格,特别是所需的列请显示
show create table your table name的输出。
我测试了您的标题和mysql 8.0.,21完全没有显示任何问题,它显示了一个警告。show create table为该列提供了与上述相同的警告。utf8mb3会自动放在那里。我的在DDL的左边空白处显示了大X,所以这肯定是一个错误,而不是警告。请告诉我为什么被否决。我费了很大劲才简明扼要地陈述了这个问题,并举例说明了问题。我做错了什么?谢谢你,克里斯。我的和你的一样,只是我放了(
usetile
=0)而不是(不是
usetile
)。有些父母是不同的,所以我解决了所有的问题。但是
\u utf8mb3
都是在我执行DDL后自动添加的。我使用的是createtable而不是altertable。然后新表被破坏了,因为我无法在设计模式下打开它。