RSS

Daily Archives: 2012/03/11 16:12:59

修改PostgreSQL表中的字段排列顺序(图解)

像MySQL 调整字段顺序很简单(FIRST、AFTER),语句如下:
ALTER TABLE “users” CHANGE “user_password” “user_password” varchar(20) AFTER “user_name”;

在PostgreSQL里也可以调整字段的顺序但是就没有这么的方便了。以下内容都测试通过请放心参考。
首先看更改前后的效果图:
PostgreSQL_Comparison 
这里介绍两种方法:是用工具(EMS SQL Manager for PostgreSQL)自带的功能;是改系统表pg_attribute。

一、EMS SQL Manager for PostgreSQL(工具功能很强大也很好用但是收费软件)
选中表,然后右键单击选择[Tasks]→[Reorder Fields]
PostgreSQL_ReorderField 
警告对话框:意思是字段将被重新创建表重新排序,确保不在你的数据库出错,是否继续,点击Yes。
 PostgreSQL_ReorderField_Warning
选中字段,然后按上下箭头更改位置,点击OK。
 PostgreSQL_ReorderColumns
最后就生成SQL文(缺点:表于表建有多层外键关系的话SQL文是生成不了的。优点:简单,快捷,方便)
分析SQL语句可以看出:1.先建临时表 2.把现有数据放到临时表 3.删除表 4.新建一个已排序好的表 5.还原数据

— 1.Create a temporary table
CREATE LOCAL TEMPORARY TABLE “order_change_table0agots” (
  “id” VARCHAR(2),
  “name” VARCHAR(20),
  “password” INET,
  “new_field” CHAR(1)
) WITH OIDS;

— 2.Copy the source table’s data to the temporary table
INSERT INTO “order_change_table0agots” (“id”, “name”, “password”, “new_field”)
SELECT “id”, “name”, “password”, “new_field” FROM “public”.”order_change_table”;

— 3.Drop the source table
DROP TABLE “public”.”order_change_table”;

— 4.Create the destination table
CREATE TABLE “public”.”order_change_table” (
  “id” VARCHAR(2) NOT NULL,
  “new_field” CHAR(1) DEFAULT 1,
  “name” VARCHAR(20),
  “password” INET,
  CONSTRAINT “order_change_table_pkey” PRIMARY KEY(“id”)
) WITH OIDS;
COMMENT ON COLUMN “public”.”order_change_table”.”new_field” IS ‘追加Field’;

— 5.Copy the temporary table’s data to the destination table
INSERT INTO “public”.”order_change_table” (“id”, “new_field”, “name”, “password”)
SELECT “id”, “new_field”, “name”, “password” FROM “order_change_table0agots”;

二、通过修改系统表(pg_attribute)达到字段重新排序的目的
有关系统表的概述及用途可以查看官网:http://www.pgsqldb.org/pgsqldoc-cvs/catalogs.html

表名字 表用途
pg_class 表,索引,序列,视图(”关系”)
pg_attribute 表的列(”属性”,”字段”)

通过pg_class查找[表,索引,视图等的名字],[表在磁盘上的文件的名字]
    SELECT relname, relfilenode FROM pg_class WHERE relname=’order_change_table’;
    查询结果为:order_change_table | 12666
通过pg_attribute查找[此列/字段所属的表],[字段名字],[字段数目]
    SELECT attrelid, attname, attnum FROM pg_attribute WHERE attrelid=12666;
    查询结果为:12666 | id | 1      12666 | name | 2      12666 | password | 3      12666 | new_field | 4
更新pg_attribute的[attnum]字段(将要移动的字段先更新成数据库里面没有的值,再按顺序更新)。
    UPDATE pg_attribute SET attnum=7 WHERE attname=’new_field’  AND attrelid=12666;
    UPDATE pg_attribute SET attnum=6 WHERE attname=’name’       AND attrelid=12666;    
    UPDATE pg_attribute SET attnum=5 WHERE attname=’password’  AND attrelid=12666;
    UPDATE pg_attribute SET attnum=2 WHERE attname=’new_field’  AND attrelid=12666;
    UPDATE pg_attribute SET attnum=3 WHERE attname=’name’        AND attrelid=12666;
    UPDATE pg_attribute SET attnum=4 WHERE attname=’password’  AND attrelid=12666;
再检索表,字段就已经改好顺序了。(缺点:一旦改错表就崩溃,事先一定要备份好。优点:直达根处)
SELECT * FROM order_change_table;

 
4条评论

Posted by 于 2012/03/11 16:12:59 在 PostgreSQL

 

标签: