MySQL之虚拟列 从MySQL 5.7开始,支持两种Generated Column,即Virtual Generated Column和Stored Generated Column;
CREATE TABLE t1 (c1 INT);
ALTER TABLE t1 ADD COLUMN c2 INT GENERATED ALWAYS AS (c11) STORED;
CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c11) STORED);
1、主键索引不能包含virtual generated column 如mysql怎么使用虚拟表:
mysql create table t(a int, b int , c int as (a / b), primary key(c));
ERROR 3106 (HY000): 'Defining a virtual generated column as primary key' is not supported for generated columns.
2、Virtual Generated Column不能作为外键
3、不能使用非确定函数,如mysql怎么使用虚拟表:
mysql alter table a ADD p3 DATE GENERATED ALWAYS AS (curtime()) virtual;
ERROR 3763 (HY000): Expression of generated column 'p3' contains a disallowed function: curtime.
4、无法删除源列,如mysql怎么使用虚拟表:
mysql alter table t100w drop k1;
ERROR 3108 (HY000): Column 'k1' has a generated column dependency.
5、非法数据,如:
mysql create table t( x int, y int, z int as( x / 0));
Query OK, 0 rows affected (0.22 sec)
mysql insert into t(x,y) values(1,1);
ERROR 1365 (22012): Division by 0
测试sql:
SELECT test_vv FROM t100w limit 10000; #虚拟列无索引
虚拟列函数:
(concat( k1 ,_utf8mb4'-', k2 ))
mysql怎么将两个表查询出来的结果再去关联下一张表?可以用两表的查询结果集做为一个虚拟表(为其取一个表别名),然后再用该虚拟表与另一张表实施连接查询即可 。请参考以下例子:
假设有三张表
1)商品表(商品ID,商品名称)
2)入库表(商品ID , 入库数量,入库时间)
3)出库表(商品ID,出库数量,出库时间)
要求列出所有商品名称、商品ID及其当前库存余额
SQL查询语句如下:
select 商品表.商品名称,商品表.商品ID,b.库存余额
from 商品表 left join
(select a.商品ID,sum(a.数量)as 库存余额 from
(select 商品ID,入库数量 as 数量 from 入库表 union all
select 商品ID,-1*出库数量 from 出库表) a group by a.商品ID) b
on 商品表.商品ID=b.商品ID;
-- 说明上述语句中的“a”和“b”分别是两个中间过渡查询结果集取的表别名,也就所谓的虚拟表 。
视图是虚拟表,数据来源于表,可以使用什么去更新数据表视图是虚拟表,数据来源于表,可以通过插入、修改和删除操作更新数据表 。根据查阅相关资料,在mysql中 , 视图是一个虚拟表,实际的数据来自于基本表,所以通过插入、修改和删除操作更新视图中的数据信息,实质上就是在更新视图所引用的基本表的数据信息 。
MySQL数据库必会技能 , 虚拟列的用法 对于想要将自动生成mysql怎么使用虚拟表的数据添加到表中的任何人来说mysql怎么使用虚拟表 , MySQL 虚拟列 是一个强大、易于使用和高级的功能 。
INSERT生成的列允许您在不使用andUPDATE子句的情况下将自动生成的数据存储在表中 。这个有用的特性自 5.7 版 起就已成为 MySQL 的一部分,它代表mysql怎么使用虚拟表了在生成数据时触发器的另一种方法 。此外,生成的列可以帮助您更轻松、更高效地查询 。
虚拟列 列类似于普通列,但您不能手动更改其值 。这是因为表达式定义了如何根据从同一行的其mysql怎么使用虚拟表他列中读取的其他值来生成生成列的值 。因此,生成的列在表的域内工作,其定义不能涉及JOIN语句 。
换句话说 , 您可以将生成的列视为一种视图,但仅限于列 。请注意,生成的列与 SQL 触发器 不同,您只能在使用CREATE TABLEor语句时定义它们,语法如下mysql怎么使用虚拟表:ALTER TABLE
该AS (generated_column_expression)子句指定要添加或更新到表中的列是生成的列 。定义 MySQL 将用于计算列值的generation_expression表达式,它不能引用另一个生成的列或除当前表的列之外的任何内容 。另外,请注意生成表达式只能涉及不可变函数 。例如,您不能在生成的列表达式定义中使用返回当前日期的函数 , 因为它是一个可变函数 。
您还可以在关键字前面AS加上GENERATED ALWAYS关键字以使生成的列的性质更加明确,但这是可选的 。然后,您可以指示生成列的类型是VIRTUAL还是STORED。您将在下面的章节中了解这两种类型之间的区别 。默认情况下,如果没有在查询中明确指定 , MySQL 会将生成的列标记为VIRTUAL.
现在让我们看看生成的列语法在CREATE TABLE查询中的作用:
在此示例中,该full_name列将自动存储first_name和last_name列的连接 。
如前所述,您可以将生成的列定义为 VIRTUAL 或 STORED 。现在让我们仔细看看这两种类型 。
MySQL 不存储标记为 VIRTUAL 的 虚拟列。这意味着 MySQL 在需要时动态评估其值 。BEFORE这通常在触发任何查询后立即发生 。换句话说,虚拟生成的列不占用存储空间 。
MySQL 存储任何生成的标记为 STORED 的列 。这意味着每次插入或更新行时,MySQL 都会评估其值并将其存储在磁盘上 。换句话说,存储列需要存储空间,就好像它是普通列一样 。
现在让我们进一步了解虚拟列和存储生成列的优缺点 。
优点
缺点
优点
缺点
采用生成的列有几个原因,但以下三个是最重要的 。
如您所见,您可以通过将四列与以下生成的列聚合来轻松生成此数据字段:
这将产生:
在这种情况下 , 生成的列使您能够直接在数据库级别标准化数据字段格式 。此外,存储生成的列避免了每次需要时都构造此字段的不可避免的开销 。
通常,您使用网站 URL 中的资源 ID 或REST API来检索您需要的数据 。但是公开暴露您的 ID 可能会带来安全问题 。当您发现自己使用自动增量 ID 时尤其如此,这很容易预测并使抓取或机器人攻击更容易 。
为避免这种情况,您可以考虑通过使用自动生成的、随机的、更安全的公共 ID 来隐藏您的原始 ID 。您可以通过对您的 ID 进行散列处理,使用虚拟生成的列来实现这一点,如下所示:
请注意,为避免生成已知的哈希值,您可以将您的 ID 与特殊关键字连接起来 。在此处了解有关 MySQL 加密和压缩功能的更多信息 。
过滤数据时,有些列比其他列更有用 。此外,您通常必须更改存储在列中的值的表示形式,以使过滤更简单或更直观 。您可以定义一个有用的生成列来存储以所需格式执行过滤所需的信息,而不是在每个过滤器查询中执行此操作 。
例如,您可以定义一个生成的列 , 以便更轻松地找到篮球队中的球员,如下所示:
这样的列将产生:
如前所述 , 您只能在表中使用生成的列 。此外,它们只能涉及不可变函数,并且MySQL 生成它们的值以响应INSERTorUPDATE查询 。另一方面,触发器是 MySQL 自动执行的存储程序,每当与特定表关联的 或 事件发生INSERT时UPDATE。DELETE换句话说,触发器可以涉及多个表和所有 MySQL 函数 。与生成的列相比 , 这使它们成为更完整的解决方案 。同时,MySQL 触发器本质上使用和定义更复杂,也比生成的列慢 。
【mysql怎么使用虚拟表 mysql如何连接虚拟机数据库】mysql怎么使用虚拟表的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql如何连接虚拟机数据库、mysql怎么使用虚拟表的信息别忘了在本站进行查找喔 。
推荐阅读
- jquery1.9.1.jsxss的简单介绍
- 荣耀9x鸿蒙公测测评,荣耀9x内测鸿蒙
- 爬虫python看不懂,python爬虫 科普
- 我的世界国外公共服务器,我的世界外国服务器地址
- linux命令不输出 linux输出不换行
- 如何营销信贷产品,信贷产品营销案例
- 少年三国志服务器,少年三国志服务器更新
- 手游代理平台排行前十名,手游代理平台排行榜前十名
- python实现回归函数的简单介绍