PostgreSQL 如何修改文本类型字段的存储方式

PostgreSQL存储方式分为以下4种:

PLAIN避免压缩或者线外存储;而且它禁用变长类型的单字节头部。这是不可TOAST数据类型列的唯一可能的策略。只是对那些不能TOAST的数据类型才有可能。

EXTENDED允许压缩和线外存储。这是大多数可TOAST数据类型的默认策略。 首先将尝试进行压缩,如果行仍然太大,那么则进行线外存储。

EXTERNAL允许线外存储,但是不许压缩。使用EXTERNAL将令那些在宽text和 bytea列上的子串操作更快(代价是增加了存储空间), 因此这些操作被优化为只抓取未压缩线外数据中需要的部分。

MAIN允许压缩,但不允许线外存储(实际上,在这样的列上仍然会进行线外存储,但只是作为没有办法把行变得足以放入一页的情况下的最后手段)。

文本的默认存储方式为EXTENDED,但是在文本字段非常小的情况下,为提升性能我们可以将文本存储方式改为PLAIN.

创建表:

drop table if exists test;
create table test(
 f1 char(1),
 f2 varchar(16),
 f3 text
 ); 

查看表定义:

\dS+ test;

Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+-----------------------+-----------+----------+---------+----------+--------------+-------------
f1 | character(1) | | | | extended | |
f2 | character varying(16) | | | | extended | |
f3 | text | | | | extended | | 

修改f1和f2的存储方式:

列f1,f2因为非常小,采用EXTENDED存储方式大量数据时性能不如PLAIN好,因此在创建表完成后可以使用以下语法修改列f1和f2的存储方式为PLAIN.

alter table test
 alter column f1 set storage plain,
 alter column f2 set storage plain;

重新查看定义:

\dS+ test;

Column |  Type  | Collation | Nullable | Default | Storage | Stats target | Description
--------+-----------------------+-----------+----------+---------+----------+--------------+-------------
f1 | character(1)  |  |  |  | plain |  |
f2 | character varying(16) |  |  |  | plain |  |
f3 | text   |  |  |  | extended |  |

对于已经有数据的表修改存储方式后的操作

首先修改字段的存储方式,然后运行

vacuum full verbose test;

vacuum full 选项可以回收空间,但有排他锁,它实际上创建该表的一个新拷贝,并且在操作完成之前都不会释放旧的拷贝。

因为会长时间锁表,请慎重使用vacuum full

补充:修改PostgreSQL的字段数据类型报错

修改字段类型

1.使用可视化工具修改列数据类型 :

注意:字段类型转varchar 或者 从 varchar 改成其它数据类型是不会出问题的。

但是直接从 money类型转到int类型(数字)就会报错。这时需要先转换成varchar 然后再转换成指定的类型。

2. 使用SQL语句修改

注意:使用sql 方式修改字段类型,也需要使用 varchar 过度,例如将 money 类型的字段转成 int4

类型,那么将执行

alter table test alter column filed type varchar using filed:: varchar
alter table test alter column filed type int4 using filed:: int4

alter table test alter column filed type varchar using filed:: varchar
-- test 表名
-- filed 字段名

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • postgresql查询锁表以及解除锁表操作

    1.-- 查询ACTIVITY的状态等信息 select T.PID, T.STATE, T.QUERY, T.WAIT_EVENT_TYPE, T.WAIT_EVENT, T.QUERY_START from PG_STAT_ACTIVITY T where T.DATNAME = '数据库用户名'; 上面查询结果中:pid就是ACTIVITY的唯一标识,state就是活动状态,query就是正在执行的sql语句,query--start就是开始执行的时间. 2.-- 查询死锁的ACTIVIT

  • postgresql数据库根据年月查询出本月的所有数据操作

    表里的所有数据: 现在我要根据创建时间的 年月查询 当月所有的数据 比如前台传给我一个年月的字段planTimeMonth,值为2018-06 那么我们需要查询创建时间为6月份的所有数据 sql: java代码中sql拼接: criteria.andCondition("to_char(crt_time, 'yyyy-mm')='"+query.get("planTimeMonth").toString()+"'"); 补充:postgresql

  • 浅谈postgresql数据库varchar、char、text的比较

    如下所示: 名字 描述 character varying(n), varchar(n) 变长,有长度限制 character(n), char(n) 定长,不足补空白 text 变长,无长度限制 简单来说,varchar的长度可变,而char的长度不可变,对于postgresql数据库来说varchar和char的区别仅仅在于前者是变长,而后者是定长,最大长度都是10485760(1GB) varchar不指定长度,可以存储最大长度(1GB)的字符串,而char不指定长度,默认则为1,这点需要

  • Postgresql 实现查询一个表/所有表的所有列名

    假设postgres有数据库testdb 在testdb下执行下列sql语句,得到所有表的信息 select * from information_schema.columns where table_schema='public' and table_name<>'pg_stat_statements'; 在testdb下执行下列sql语句,得到所有表的列名 select column_name from information_schema.columns where table_sche

  • postgresql 修改列类型操作

    习惯了Oracle中: ALTER TABLE 表名 ALTER COLUMN 列名 新的数据类型[(长度)] NULL或NOT NULL 这种修改方式的时候,在pg中: highgo=# create table p1 (id int,pswd varchar(30),time timestamp); CREATE TABLE highgo=# insert into p1 select generate_series(1,500000),md5('random()::text'),clock

  • PostgreSQL 查找当前数据库的所有表操作

    实现的功能类似MySQL: show tables; 在 PostgreSQL 中需要写: select * from pg_tables where schemaname = 'public'; 返回结果类似如下: schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity ------------+-----------+------------+--

  • PostgreSQL 如何修改文本类型字段的存储方式

    PostgreSQL存储方式分为以下4种: PLAIN避免压缩或者线外存储:而且它禁用变长类型的单字节头部.这是不可TOAST数据类型列的唯一可能的策略.只是对那些不能TOAST的数据类型才有可能. EXTENDED允许压缩和线外存储.这是大多数可TOAST数据类型的默认策略. 首先将尝试进行压缩,如果行仍然太大,那么则进行线外存储. EXTERNAL允许线外存储,但是不许压缩.使用EXTERNAL将令那些在宽text和 bytea列上的子串操作更快(代价是增加了存储空间), 因此这些操作被优化

  • 使用JPA插入枚举类型字段

    目录 JPA插入枚举类型字段 1. 插入枚举名称的值,即字符串 2. 插入枚举的序号,即ordinal 3.插入枚举中的自定义值 JPA枚举类型处理 JPA插入枚举类型字段 JPA插入枚举类型字段,有三种方式: 插入枚举字面值 插入枚举序号 插入枚举中自定义的值 例如,我们有个枚举类: public enum Gender {     BOY("1" , "boy" , "Boy");     GIRL("2" , "

  • postgresql 实现修改jsonb字段中的某一个值

    我就废话不多说了,大家还是直接看代码吧~ UPDATE tablename SET tags = jsonb_set(tags-'landuse_area', '{landuse_area}',('"' || round((ST_Area(ST_Transform(geom,4527)) * 0.0015) :: NUMERIC,3) || '"')::jsonb, TRUE) WHERE tags @> '{"name":"张三"}';

  • Postgresql数据库中的json类型字段使用示例详解

    目录 1. Json概述 2. Postgresql数据库中使用Json类型字段 2.1. 创建表定义字段信息 2.2. 增加 2.3. 查询键值 2.3.1. 查询键 2.3.2. 查询值 2.3.3. where查询条件使用json键值作为条件 PostgreSQL 最重要的文档性数据类型就是JSON了,与 MongoDB 的BSON相比较,PostgreSQL 或许更加强大,因为它能与原有的关系性范式兼容,给数据库存储与维护带来了更多的可行性和便利性. 1. Json概述 JSON 代表

  • 深入浅析mybatis oracle BLOB类型字段保存与读取

    一.BLOB字段 BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写.其中BLOB是用来存储大量二进制数据的:CLOB用来存储大量文本数据.BLOB通常用来保存图片.文件等二进制类型的数据. 二.使用mybatis操作blob 1.表结构如下: create table BLOB_FIELD ( ID VARCHAR2(64 BYTE) not null, TAB_NAME VARC

  • postgresql中的ltree类型使用方法

    postgresql有很多比较妖的数据类型,ltree算一个. 简介 ltree是Postgresql的一个扩展类型 http://www.sai.msu.su/~megera...,在解决树形结构的数据存储上使用. 查看是否安装了插件 select * from pg_extension where extname = 'ltree'; 定义 字段的格式为:L1.L2.L3.L4.L5.L6..... 标签是一系列字母数字字符和下划线A-Za-z0-9_, 标签长度必须小于256个字节.标签路

  • django filter过滤器实现显示某个类型指定字段不同值方式

    1,前端样式 2,html代码 {% load asset_filter %} <div class="col-sm-2"> <select class="input-sm form-control select2 inline" name="ServiceModel"> <option value="">模块</option> {% for i in 'Ecs'|ecs_mod

  • mysql中json类型字段的基本用法实例

    目录 前言 基本环境 JSON类型字段常用操作 插入JSON类型数据 查询JSON类型数据 更新JSON类型数据中的特定字段 匹配JSON类型数据中的特定字段 结语 前言 mysql从5.7.8版本开始原生支持了JSON类型数据,同时可以对JSON类型字段中的特定的值进行查询和更新等操作,通过增加JSON类型的属性可以大大的提高我们在mysql表中存储的数据的拓展性,无需每次新增字段时都进行表结构的调整,下面我们不深入讲解底层的实现原理,我们主要来梳理一下我们在日常工作中使用实践 基本环境 my

  • MySQL之JSON类型字段的使用技巧分享

    目录 准备工作 JSON对象基础操作 JSON数组操作 更多操作 JSON字段在JAVA中的实践 测试环境: MySQL8.0.19 准备工作 CREATE TABLE json_demo ( `id` INT ( 11 ) NOT NULL PRIMARY KEY, `content` json NOT NULL ); INSERT INTO json_demo ( id, content ) VALUES /*这条是数组*/ ( 1, '[{"key": 1, "orde

  • 关于SQL Server中bit类型字段增删查改的一些事

    前言 本文主要给大家介绍了关于SQL Server中bit类型字段增删查改的一些事,话说BIT类型字段之前,先看"诡异"的一幕,执行Update成功,但是查询出来的结果依然是1,而不是Update的2 当别人问起我来的时候,本人当时也是处于懵逼状态的,后面联想具体的业务突然想起来这个字段是bit类型的 如果把这个现象跟BIT类型字段连续起来就不觉得奇怪了. 废话不多,直接上代码看结果就好了. 先建一个测试表 CREATE TABLE TestBIT ( Id INT IDENTITY(

随机推荐