0

0

如何在可视化界面创建虚拟生成列_VIRTUAL与STORED表达式的编写与验证

P粉602998670

P粉602998670

发布时间:2026-03-17 01:51:08

|

536人浏览过

|

来源于php中文网

原创

MySQL 8.0+生成列必须显式声明类型、仅用确定性表达式;VIRTUAL列禁用非确定函数(如NOW)、不可建索引(旧版),STORED列可存非确定结果、可建索引和参与联合主键。

MySQL 8.0+ 中 VIRTUALSTORED 列怎么写才不报错

直接说结论:不加显式类型声明、用到非确定性函数(比如 now()rand())、或在 virtual 列里引用了其他生成列但顺序错了,都会触发 error 3105 (hy000)error 3106 (hy000)

生成列必须带明确数据类型,且表达式只能包含「确定性」函数和列引用。比如 id + 1 可以,UNIX_TIMESTAMP(NOW())VIRTUAL 里就不行(NOW() 非确定性);但 STORED 允许部分非确定性函数(仅限插入/更新时求值,后续只存结果)。

  • VIRTUAL 列不占存储空间,每次查询实时计算,不能建索引(除非 MySQL 5.7.9+ 且是确定性表达式)
  • STORED 列会真实写入磁盘,可建索引、可用于外键,但写入性能略低
  • 表达式里不能出现子查询、参数化变量(如 @var)、用户定义函数(UDF),除非标记为 DETERMINISTIC
  • 生成列不能是主键,但如果类型允许且是 STORED,可以参与联合主键

CREATE TABLE 时定义生成列的常见写法与坑点

最简能跑通的写法是:col_name INT AS (some_expr) STOREDVIRTUAL,但漏掉类型或括号位置错就直接失败。

错误示例:price_total AS (price * qty) —— 缺少类型,MySQL 不推导;name_upper VARCHAR(100) AS UPPER(name) VIRTUAL —— UPPER() 后面少了括号,语法报错。

  • 类型必须显式声明,哪怕和表达式结果完全一致,例如 full_name VARCHAR(200) AS (CONCAT(first_name, ' ', last_name)) STORED
  • AS 后面的表达式必须用圆括号包裹,哪怕只有一项,如 id_plus_1 INT AS (id + 1) VIRTUAL
  • 如果表达式涉及字符串拼接,注意字符集和排序规则继承问题,可能触发 ERROR 1366,建议显式 cast:CONVERT(CONCAT(a, b) USING utf8mb4)
  • 生成列名不能和已有列同名,也不能叫 rowidoid 等保留字(即使没报错,后续工具可能出问题)

可视化工具(如 phpMyAdmin、DBeaver、Navicat)里添加生成列的实际限制

多数 GUI 工具对生成列支持有限:phpMyAdmin 的「结构 → 添加字段」界面根本不显示 AS 输入框;DBeaver 能识别已存在的生成列,但新建时往往只能走 SQL 模式;Navicat 8.2+ 支持图形化勾选 Generated Column,但类型下拉菜单里没有 JSONPOINT,得手动写 DDL。

所以别指望点点点完成。真实流程是:先在 GUI 里建好基础表,再切到「SQL」页执行 ALTER TABLE,或者直接用命令行验证。

Flowith
Flowith

一款GPT4驱动的节点式 AI 创作工具

下载
  • phpMyAdmin 中执行 ALTER TABLE orders ADD COLUMN total DECIMAL(10,2) AS (quantity * unit_price) STORED 是可行的,但「创建新字段」表单里找不到 AS 字段
  • DBeaver 的「编辑表」对话框里,生成列的「Expression」栏常为空或灰色不可填,必须右键 → 「Generate SQL」→ 手动补全
  • 所有工具在保存含生成列的表结构前,都不会帮你校验表达式是否合法,错误只在执行时抛出

怎么快速验证生成列表达式是否生效且行为符合预期

别只看 DESCRIBE table_name 是否显示 GENERATED ALWAYS AS,那只是元数据存在。关键看三件事:插入是否成功、查询值是否实时更新、索引是否真起作用。

一个可靠验证步骤:插入一行原始数据 → 单独 SELECT 生成列 → 修改原始列 → 再查生成列是否同步变 → 对 STOREDCREATE INDEXEXPLAIN 查询是否用上索引。

  • 测试非确定性场景:ts_stored TIMESTAMP AS (NOW()) STORED 插入后查两次,值应相同;而 ts_virtual TIMESTAMP AS (NOW()) VIRTUAL 会报错,因为 NOW() 不被允许
  • SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME = 't' AND EXTRA LIKE '%generated%' 确认生成列状态和类型
  • VIRTUAL 列执行 CREATE INDEX idx_v ON t (virtual_col),MySQL 8.0.22+ 才支持,旧版本直接报错 ERROR 3107
  • 如果生成列值为 NULL 但预期不是,大概率是表达式中某字段为 NULL 导致整条计算结果为 NULL(SQL 三值逻辑),加 COALESCE() 包一层更稳妥

生成列看着简单,但类型绑定、确定性约束、GUI 工具断层、索引兼容性这四块,任一块疏忽都会卡在上线前最后一分钟。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1135

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2256

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1743

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

587

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

441

2024.04.29

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号