SQL server的studio有一个功能,可以随意拖拽表字段,更改其位置并使之重新排序,有同事问起,Postgres是否也可以。Postgres每个字段的顺序是在系统表pg_attribute里面定义,下面实际操作一下看是否支持。

数据准备:

postgres=# create table tbl_kenyon(id int,vname varchar(30),remark text);
CREATE TABLE
postgres=# insert into tbl_kenyon select generate_series(1,10),'Kenyon_good','Nothing is impossible';
INSERT 0 10
postgres=# select attrelid,attname,attnum from pg_attribute where attrelid = (select relfilenode from pg_class where relname = 'tbl_kenyon');
attrelid | attname | attnum
----------+----------+--------
24894 | tableoid | -7
24894 | cmax | -6
24894 | xmax | -5
24894 | cmin | -4
24894 | xmin | -3
24894 | ctid | -1
24894 | id | 1
24894 | vname | 2
24894 | remark | 3
(9 行记录) postgres=# select ctid,* from tbl_kenyon;
ctid | id | vname | remark
--------+----+-------------+-----------------------
(0,1) | 1 | Kenyon_good | Nothing is impossible
(0,2) | 2 | Kenyon_good | Nothing is impossible
(0,3) | 3 | Kenyon_good | Nothing is impossible
(0,4) | 4 | Kenyon_good | Nothing is impossible
(0,5) | 5 | Kenyon_good | Nothing is impossible
(0,6) | 6 | Kenyon_good | Nothing is impossible
(0,7) | 7 | Kenyon_good | Nothing is impossible
(0,8) | 8 | Kenyon_good | Nothing is impossible
(0,9) | 9 | Kenyon_good | Nothing is impossible
(0,10) | 10 | Kenyon_good | Nothing is impossible
(10 行记录)

数据调整,校验:

postgres=# update pg_attribute set attnum = 4 where attrelid = 24894 and attname = 'id';
UPDATE 1
postgres=# update pg_attribute set attnum = 1 where attrelid = 24894 and attname = 'vname';
UPDATE 1
postgres=# update pg_attribute set attnum = 2 where attrelid = 24894 and attname = 'id';
UPDATE 1
postgres=# select attrelid,attname,attnum from pg_attribute where attrelid = (select relfilenode from pg_class where relname = 'tbl_kenyon');
attrelid | attname | attnum
----------+----------+--------
24894 | tableoid | -7
24894 | cmax | -6
24894 | xmax | -5
24894 | cmin | -4
24894 | xmin | -3
24894 | ctid | -1
24894 | vname | 1
24894 | id | 2
24894 | remark | 3
(9 行记录)

但是查询的时候会直接报错

postgres=# select * from tbl_kenyon;
ERROR: invalid memory alloc request size 1870229097
postgres=# select * from tbl_kenyon limit 1;
ERROR: invalid memory alloc request size 1870229097
postgres=# vacuum full verbose analyze tbl_kenyon;
INFO: vacuuming "public.tbl_kenyon"
ERROR: invalid memory alloc request size 1870229097

才10条数据肯定不可能报这种内存不够的错误,其实是表/数据奔溃。
基于这个表再建其他表,同样是不可访问的。

postgres=# create table tbl_kenyon_new as select *from tbl_kenyon;
SELECT 10
postgres=# select * from tbl_kenyon_new;
ERROR: invalid memory alloc request size 1870229097

我们试着把顺序改回来:

postgres=# update pg_attribute set attnum = 4 where attrelid = 24894 and attname = 'id';
UPDATE 1
postgres=# update pg_attribute set attnum = 2 where attrelid = 24894 and attname = 'vname';
UPDATE 1
postgres=# update pg_attribute set attnum = 1 where attrelid = 24894 and attname = 'id';
UPDATE 1 postgres=# select ctid,* from tbl_kenyon;
ctid | id | vname | remark
--------+----+-------------+-----------------------
(0,1) | 1 | Kenyon_good | Nothing is impossible
(0,2) | 2 | Kenyon_good | Nothing is impossible
(0,3) | 3 | Kenyon_good | Nothing is impossible
(0,4) | 4 | Kenyon_good | Nothing is impossible
(0,5) | 5 | Kenyon_good | Nothing is impossible
(0,6) | 6 | Kenyon_good | Nothing is impossible
(0,7) | 7 | Kenyon_good | Nothing is impossible
(0,8) | 8 | Kenyon_good | Nothing is impossible
(0,9) | 9 | Kenyon_good | Nothing is impossible
(0,10) | 10 | Kenyon_good | Nothing is impossible
(10 行记录)

OK,它回来了。目前该系统表的表结构有一个组合主键(attrelid,attrnum),所以不能随便更新attrnum值,极有可能报如下错:

postgres=# update pg_attribute set attnum = 1 where attrelid = 24894 and attname = 'id';
ERROR: duplicate key value violates unique constraint "pg_attribute_relid_attnum_index"
描述: Key (attrelid, attnum)=(24894, 1) already exists.

总结:
目前并不希望用户去更改postgres表字段的顺序,否则极有可能造成数据奔溃或不可访问。要更改表字段的顺序,一般就通过重建表或者创建新字段以及使用视图等其他手段来实现。

PostgresSql更改字段位置后,数据库异常的更多相关文章

  1. SQL服务器更改名称后

    SQL服务器更改名称后 编写人:CC阿爸 2014-6-15 在日常SQL 2005数据库的操作中,有时安装完成数据库后,再更名,造成部分SQL服务不能正常使用(在SQL2000 时,想都别想更名了) ...

  2. docker+mysql 更改配置后重启不了的解决方案

    docker+mysql 更改配置后重启不了的解决方案 前提:在最近的项目中,决定将项目改造成数据库读写分离的架构,于是擅自更改生产环境的数据库的配置文件my.cnf,由于我是用docker进行部署的 ...

  3. 【Python+Django+Pytest】数据库异常pymysql.err.InterfaceError: (0, '') 解决方案

    问题背景: 接口自动化测试平台,在执行测试案例之外,还需要做以下五件事情(或步骤): 1.查询用户在数据准备中预置的测试套件层数据初始化相关sql  (setUp_class方法中) 2.查询用户在数 ...

  4. Atitit 拦截数据库异常的处理最佳实践

    Atitit 拦截数据库异常的处理最佳实践 需要特殊处理的ex 在Dao层异常转换并抛出1 Server层转换为业务异常1 需要特殊处理的ex 在Dao层异常转换并抛出 } catch (SQLExc ...

  5. oracle所在磁盘空间不足导致了数据库异常

    oracle所在磁盘空间不足导致了数据库异常.需要减小数据文件的大小来解决. 1.检查数据文件的名称和编号 select file#,name from v$datafile; 2.看哪个数据文件所占 ...

  6. Oracle误删表空间文件后数据库无法启动

    [问题描述]Oracle误删表空间文件后数据库无法启动,报错表空间文件不存在 [解决办法]sqlplus / as sysdba       #以dba身份登陆数据库shutdown immediat ...

  7. VCS引起的oracle数据库异常重新启动一例

    1. 环境描写叙述 操作系统版本号:SUSE Linux Enterprise Server 10 sp2 (x86_64) 数据库版本号:Oracle 11.1.0.7.16 VCS版本号:5.1 ...

  8. 解决sqlite 删除记录后数据库文件大小不变

    最的做的项目中要有到sqlite数据存储,写了测试程序进行测试,存入300万条记录,占用flash大小为 86.1M,当把表中的记录全部删除后发后数据库文件大小依然是 86.1M: 原因是:sqlit ...

  9. hadoop更改保存路径后,批量重启不能启动datanode(或者format以后不能启动datanode)

    这是因为更改文件后,所有的子节点的core-site.xml并没有一致,所以使用start-dfs.sh的时候导致机器起不起来. 修改slave(datanode)节点的core-site.xml就可 ...

  10. Mysql数据库异常

    1. Mysql数据库异常 1.1. 数据库问题之Got error 28 from storage engine 原因首先检查磁盘是否已满,df -h一下 很可能是日志数据过大,查看该目录下文件夹和 ...

随机推荐

  1. SLM6500电磁干扰认证设计PCB

    SLM6500 是一款面向5V交充适配器的2A离子电池充电器.它是采用1.5MHz固定频率的步降压型转换器,利用芯片内部的功率晶体管电池进行涓流.恒流和恒压充电.充电电流可用外部电阻编程设定,持续充电 ...

  2. node版本管理工具fnm踩坑

    我建议是直接不要用fnm,还是老老实实用nvm吧 fnm下下来电脑防火墙会报毒(用github上推荐的cargo install fnm方式下载,并非第三方安装) Trojan.Generic.HgE ...

  3. python中的字符串(1)

    1.大小写的转换 upper()/lower() 转成大写.upper() 转成小写.lower() 返回的是字符串 2.是否是数字 isdigit() 返回的布尔值 3.去除字符串的空白字符 str ...

  4. Chaos 测试下的若干 NebulaGraph Raft 问题分析

    Raft 是一种广泛使用的分布式共识算法.NebulaGraph 底层采用 Raft 算法实现 metad 和 storaged 的分布式功能.Raft 算法使 NebulaGraph 中的 meta ...

  5. 重新捋一捋React源码之更新渲染流程

    前言 前些天在看Dan Abramov个人博客(推荐阅读,站在React开发者的角度去解读一些API的设计初衷和最佳实践)里的一篇文章,其重点部分的思想就是即使不使用Memo(),也可以通过组合的方式 ...

  6. [深度学习] tf.keras入门1-基本函数介绍

    目录 构建一个简单的模型 序贯(Sequential)模型 网络层的构造 模型训练和参数评价 模型训练 模型的训练 tf.data的数据集 模型评估和预测 基本模型的建立 网络层模型 模型子类函数构建 ...

  7. [UOJ96] 【集训队互测2015】胡策的小树

    先考虑不掺金坷垃的做法. 设猴子处于 \(i\) 节点的概率为 \(f_i\),列出方程如下(\(i\) 的祖先包括自身): \[f_i = \sum_{j为i祖先}\frac{1-p_j}{siz_ ...

  8. MQ系列10:如何保证消息幂等性消费

    MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 MQ系 ...

  9. 阿里云Imagine Computing创新技术大赛决赛启幕!

    2023年1月,由阿里云与英特尔主办,阿里云天池平台.边缘云.视频云共同承办的"新算力 新体验"Imagine Computing创新技术大赛复赛圆满落幕.经过两个多月的激烈角逐, ...

  10. (原创)【B4A】一步一步入门01:简介、开发环境搭建、HelloWorld

    一.前言 作者注:絮絮叨叨,可跳过不看. 一直有开发跨平台软件的需求.因为我的主力是C# ,所以当MAUI出现后,我欣喜若狂的开始学习研究.但是经历了两个月左右的时间,我弃坑了,我发现MAUI不是我能 ...