数据库中生成列的对比

简介

        生成列(虚拟列):在实际开发中,相对一个历史数据的表增加一个字段,增加下游报表,数据分析的可用性。常见的方法就是删表重建,或者使用ADD  column    语法。如果是一个历史表,删掉表数据是有风险的,历史的数据不一定还能再复现。第二中ADD COLUMN语法,随然你可以再存储中增加这个字段的处理,但是先前的数据行并不会有数据。那意义也就不大了。由此postgresql衍生出生成列的概念。

        生成列(虚拟列)目前仅仅支持,现有字段的值衍生计算后的值作为生成列的值。不支持子查询、表关联相关的运算。且生成列在运算中,不能被在INSERT 或 UPDATE 。以下用oracle、postgresql、mysql数据库进行举例。

目录

简介

语法

oracle 示例

插入数据随机数

查看表占用生成空间大小

增加生成列

mysql示例

关键字说明


语法

       

/****************************oracel*****************************/
CREATE TABLE products (product_no integer,name varchar2(100),price number,discounted_price AS (price * 0.9)
);/****************************postgresql***********************/
CREATE TABLE products (product_no integer,name text,price numeric,discounted_price numeric GENERATED ALWAYS AS (price * 0.9) STORED
);/*************************mysql*********************/CREATE TABLE products (product_no INT,name VARCHAR(100),price DECIMAL(10,2),discounted_price DECIMAL(10,2) AS (price * 0.9)
);

oracle 示例

----向数据库中插入随机数CREATE TABLE products (product_no integer,name varchar2(100),price number
);

插入数据随机数

BEGINFOR i IN 1..1000000 LOOPINSERT INTO products (product_no, name, price)VALUES (i, 'Product ' || i, DBMS_RANDOM.VALUE(1,100));END LOOP;COMMIT;
END;
/

 

ALTER TABLE products 
ADD (discounted_price AS (price * 0.9));


ALTER TABLE products 
ADD (discounted_price number GENERATED ALWAYS AS (price * 0.9) VIRTUAL);

两种语法是等价关系,并且VIRTUAL关键字是”虚拟化“的含义,并不会占用存储空间。

查看表占用生成空间大小

SELECT segment_name "Table Name", BYTES/1024/1024 "Size (MB)"
FROM user_segments
WHERE segment_name = 'PRODUCTS';

增加生成列

使用ALTER TABLE products ADD (discounted_price AS (price * 0.9)); 语法

ALTER TABLE products ADD (discounted_price AS (price * 0.9));

增加非物理存储的生成列并没有增加表空间大小。 

重新增加生成列使用ALTER TABLE products ADD (discounted_price number GENERATED ALWAYS AS (price * 0.9) VIRTUAL); 语法


##删掉刚刚增加的生成列,重新增加一个
ALTER TABLE products drop column discounted_price ;
##新增物理存储式的生成列
ALTER TABLE products ADD (discounted_price number GENERATED ALWAYS AS (price * 0.9) VIRTUAL);

        两种生成方式在Oracle中并不占用空间,只是会在表被检索的时候重新被计算出来。

mysql示例

创建测试表,并插入数据

CREATE TABLE products (product_no INT,name VARCHAR(100),price DECIMAL(10,2)
);DELIMITER //
CREATE PROCEDURE insert_random_data()
BEGINDECLARE i INT DEFAULT 0;WHILE i < 1000000 DOINSERT INTO products (product_no, name, price) VALUES (i, CONCAT('Product ', i), RAND() * 100);SET i = i + 1;END WHILE;
END; //
DELIMITER ;
CALL insert_random_data();

    为增加生成列前看一下表的空间大小

SELECT table_name AS `Table`, round(((data_length + index_length) / 1024  ), 2) `Size in KB` 
FROM information_schema.TABLES 
WHERE table_schema = "world"AND table_name = "products";

   mysql 生成列的创建方式有两种


非物理存储的生成列:
ALTER TABLE products
ADD COLUMN discounted_price DECIMAL(10,2) AS (price * 0.9);物理存储的生成列:
ALTER TABLE products
ADD COLUMN discounted_price DECIMAL(10,2) AS (price * 0.9) STORED;在这些示例中,discounted_price是一个生成列,它的值总是等于price列的值乘以0.9。每当price列的值改变时,discounted_price列的值也会自动更新。第一个示例中的生成列是非物理存储的,即它的值在查询时实时计算。第二个示例中的生成列是物理存储的,即它的值在物理存储中保存。

使用ALTER TABLE products
ADD COLUMN discounted_price DECIMAL(10,2) AS (price * 0.9);语法增加生成

ALTER TABLE products
ADD COLUMN discounted_price DECIMAL(10,2) AS (price * 0.9);

此时表空间大小仍然是352KB 没有变化

使用ALTER TABLE products
ADD COLUMN discounted_price DECIMAL(10,2) AS (price * 0.9) STORED;语法增加生成列

drop table products ;CREATE TABLE products (product_no INT,name VARCHAR(100),price DECIMAL(10,2)
);--增加数据
CALL insert_random_data();--查看表大小SELECT table_name AS `Table`, round(((data_length + index_length) / 1024  ), 2) `Size in KB` 
FROM information_schema.TABLES 
WHERE table_schema = "world"AND table_name = "products";
--增加生成列ALTER TABLE products
ADD COLUMN discounted_price DECIMAL(10,2) AS (price * 0.9) STORED;--再查看表大小SELECT table_name AS `Table`, round(((data_length + index_length) / 1024  ), 2) `Size in KB` 
FROM information_schema.TABLES 
WHERE table_schema = "world"AND table_name = "products";

         这里说明一下在mysql、oracle、postgresql三个数据库中只有mysql虚拟列物理化存储和非物理化存储,Oracle只是支持非物理化存储,postgresql只支持物理化存储。 这个关于mysql的回答AI倒是没有回答错误。

关键字说明

        官网给出的示例语法中有两组关键字GENERATED ALWAYS AS 、STORED。

[GENERATED ALWAYS] AS 是必须带有的,而且不可变。[STORED|VIRTUAL] 几种数据库中可以根据这个关键字来判断是否是物化存储列。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/226580.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子学会C/C++编程等级考试2022年06月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:制作蛋糕 小A擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要2个单位的香蕉,250个单位的面粉,75个单位的糖,100个单位的黄油。制作一个巧克力蛋糕需要75个单位的可可粉,200个单位的面粉,150个单位的糖,150个单位的黄…

交叉编译

1. 交叉开发 交叉编译&#xff1a; 在电脑把程序编写 编译 调试好 再下载到嵌入式产品中运行 编译&#xff1a; gcc 之前编译环境和运行环境是一样的 交叉编译&#xff1a; 编译 把编译代码和运行分开 编译代码在虚拟机中 运行…

vue3(二)-基础入门之列表循环、数组变动检测、filter模糊查询、事件修饰符

一、列表循环 of 和 in 都是一样的效果 html代码&#xff1a; <div id"app"><ul><li v-for"item of datalist">{{ item }}</li></ul><ul><li v-for"item in dataobj">{{ item }}</li></u…

福州大学《嵌入式系统综合设计》 实验八:FFMPEG视频编码

一、实验目的 掌握使用算能平台进行视频编码的流程&#xff0c;包括开发主机环境与云平台的配置&#xff0c;视频编码程序的编写与理解&#xff0c;代码的编译、运行以及学习使用码流分析工具分析视频压缩码流等。 二、实验内容 搭建实验开发环境&#xff0c;编译并运行编码…

unity3d地图、地面跟着NPC跑

清除烘焙后&#xff0c;再 将地图、地面的设置为非静态。只设置NPC的寻路路面为静态&#xff0c;再烘焙

全面介绍SSO(单点登录)

全面介绍SSO&#xff08;单点登录&#xff09; SSO英文全称Single SignOn&#xff0c;单点登录。SSO是在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比…

学习知识回顾随笔(远程连接MySQL|远程访问Django|HTTP协议|Web框架)

文章目录 如何远程连接MySQL数据库1.创建用户来运行&#xff0c;此用户从任何主机连接到mysql数据库2.使用IP地址来访问MySQL数据库 如何远程访问Django项目Web应用什么是Web应用应用程序的两种模式Web应用程序的优缺点 HTTP协议&#xff08;超文本传输协议&#xff09;简介HTT…

monorepo多项目管理主流实现方式:1.learn + yarn/npm workspace 2.pnpm

npm域级包 随着npm包越来越多&#xff0c;而且包名也只能是唯一的&#xff0c;如果一个名字被别人占了&#xff0c;那你就不能再使用这个名字&#xff1b;假设我想要开发一个utils包&#xff0c;但是张三已经发布了一个utils包&#xff0c;那我的包名就不能叫utils了&#xff…

final关键字-Java

final关键字 一、使用场景1、当不希望类被继承时&#xff0c;可以用final修饰。2、当不希望父类的某个方法被子类覆盖/重写(override)时&#xff0c;可以用final修饰。3、当不希望类的的某个属性的值被修改&#xff0c;可以用final修饰。4、当不希望某个局部变量被修改&#xf…

【传智杯】儒略历、评委打分、萝卜数据库题解

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; 蓝桥杯 &#x1f319;请不要相信胜利就像山坡上的蒲公英一样唾手…

【DeepLearning.AI】吴恩达系列课程——使用Gradio构建AI应用

目录 前言一、Gradio介绍1-1、Gradio介绍1-2、安装1-3、小栗子 二、使用Gradio构建AI应用2-1、NLP任务2-1-1、文本摘要2-1-2、命名实体识别 2-2、聊天任务&#xff08;ChatYuan&#xff09;2-2-1、模型介绍2-2-2、模型下载、参数设置2-2-3、模型测试2-2-4、嵌入到Gradio里2-2-5…

智安网络|探索云安全合规要求:等保2.0时代的新趋势解析

随着信息技术的不断发展和应用的广泛普及&#xff0c;信息安全问题日益凸显&#xff0c;特别是在云计算时代&#xff0c;企业对于云平台的安全保障需求更为迫切。等级保护&#xff08;等保&#xff09;作为我国信息安全的基本要求&#xff0c;已经进入了2.0时代&#xff0c;对于…