杂记:pgAdmin 修改表结构遇到的坑

概述

Oracle 转 PostgreSQL,免费的才是最贵的,一个 pgAdmin 就有各种小坑、大坑、甚至天坑等着埋人。
注意字段名大小写还可以避免踩坑,有些就是天坑跳不过去了。

案例

起因

数据库中有一张配置表,记录各公司的一些基本业务参数,业务上的数据是按照公司来划分的,而且是固定的几个分公司,没有变动的需求。一个用户的所属公司决定了登录用户该使用的业务配置是什么。这就是一个只读使用的表,数据量10条左右。运行中无锁应该不会有冲突。
然后新的业务需求是:某个模块新加一个小业务,要在该配置表中加个字段。

操作

简单的 ALTER TABLE 加字段,结果在 pgAdmin 的 Query Tool 窗口中执行后长等(几十分钟)都没有结束。
还有途径——在左侧对象树中查找到表对象,右键属性,然后在 Columns 列表中添加了字段。

问题

结果 SELECT 新增字段的时候出了字段不存在的错。

坑1 —— 大小写不敏感

PostgreSQL 照理是大小写不敏感的,平时用大写方式(因为从设计书复制过来防止手工拼写错)创建/添加字段,

alter table CONFIG add X_VALUE int;

然后用小写或大小写混合(拼写错马上可以发现不需要复制)的方式使用字段是没问题的。

SELECT x_Value FROM config WHERE ...

所以在通过表对象添加字段时也用了大写。
出了字段不存在的错后一同查找,当左侧对象数选中表对象时,右侧关不掉的那个 SQL 窗体自动生成的 sql 语句中字段名是强制大写的。

CREATE TABLE IF NOT EXISTS config
(
    ...
    "X_VALUE" integer

而指定字段名的 SELECT 语句(如前)其实会先把字段名先转小写再去匹配(这就是平常所谓的大小写不敏感),所以出错。

坑2 —— 修改表结构的超大范围锁

知道了原因,那么在表属性中把字段名该为小写就行。结果——
属性对话框结束不了又是长等。强制关闭对话框在 Query Tool 窗口执行该表的 SELECT 长等。想新开一个 Query Tool 窗口,开了窗口没有正常的显示,长等。操作一下左边的对象树,长等。
关闭就的 pgAdmin,新开一个,然后在启动自动开启的五个窗口之一的 Dashboard 的 Sessions 列表中,发现属于自己IP的 Session 有 Wait event 值是 Lock: relation
估计是执行 ALTER TABLE 语句和表属性大写改小写的长等,就是因为不是在表一级加锁而是在整个数据库的结构上加锁。而这是多人同时使用的数据库,几个 JDBC 的会话即使 Wait event 列是空的都是红色状态(有没有人知道颜色的意义?)。
这个 Lock: relation 不影响他人的事务,结果把自己锁住了。而通过表对象添加字段可以快速成功,说明有更小的锁可以利用,却非得用个超大锁。
简单的 ALTER TABLE 把自身长锁也只在 PostgreSQL 中碰到。

解决方案

在 Sessions 列表删除 Lock: relation 的会话,建议换一台主机按IP全删——强行关闭的 pgAdmin 留下的其他会话。
而要大写改小写只能协调一下,让其他人结束使用,单人修改。

你可能感兴趣的:(PostgreSQL,数据库,postgresql)