能否在同表中创建引用其他VIRTUAL GENERATED列的虚拟生成列?
问题解答:虚拟生成列能否引用同表其他虚拟生成列?
MySQL不允许虚拟生成列(VIRTUAL GENERATED)的表达式引用同表中的其他虚拟生成列,这就是你触发错误#4029的核心原因。
错误提示里的“uninitialized field”本质是因为虚拟列并非物理存储在表中,而是在查询执行时动态计算的。MySQL无法保证虚拟列的计算顺序,也不支持将一个虚拟列作为另一个虚拟列的依赖项——当你尝试用fullname(虚拟列)来生成新的虚拟列时,MySQL无法确保fullname的计算逻辑先于新列执行,因此判定它是“未初始化”的字段。
你最终采用的方案是正确的:创建虚拟生成列时,只能直接引用表中的实体字段(即非生成列、物理存储的字段)。举个例子,如果fullname原本是由first_name和last_name拼接的虚拟列,fulladdress是由street、city等实体字段拼接的虚拟列,那么你需要把customer_information的表达式改成直接拼接这些实体字段:
ALTER TABLE customers ADD COLUMN customer_information VARCHAR(300) GENERATED ALWAYS AS (CONCAT(first_name, ' ', last_name, ' ', street, ' ', city)) AFTER id;
这样就能避开虚拟列之间的引用限制,成功创建所需的生成列。
内容的提问来源于stack exchange,提问作者Robert Holland
相关产品推荐
相关产品推荐

