是否可以在Postgres 8.1中更改列的自然顺序?
我知道你不应该依赖列顺序 - 它对我正在做的事情并不重要 - 我只需要它以一种更令人愉悦的方式制作一些自动生成的东西,以便字段顺序匹配所有从pgadmin通过后端到前端的方式.
你实际上可以直接改变列顺序,但我几乎不推荐它,你应该非常小心,如果你决定这样做.
例如.
# CREATE TABLE test (a int, b int, c int); # INSERT INTO test VALUES (1,2,3); # SELECT * FROM test; a | b | c ---+---+--- 1 | 2 | 3 (1 row)
现在,对于棘手的问题,您需要使用postgres用户连接到您的数据库,以便您可以修改系统表.
# SELECT relname, relfilenode FROM pg_class WHERE relname='test'; relname | relfilenode ---------+------------- test_t | 27666 (1 row) # SELECT attrelid, attname, attnum FROM pg_attribute WHERE attrelid=27666; attrelid | attname | attnum ----------+----------+-------- 27666 | tableoid | -7 27666 | cmax | -6 27666 | xmax | -5 27666 | cmin | -4 27666 | xmin | -3 27666 | ctid | -1 27666 | b | 1 27666 | a | 2 27666 | c | 3 (9 rows)
attnum是一个唯一的列,因此在修改列号时需要使用临时值:
# UPDATE pg_attribute SET attnum=4 WHERE attname='a' AND attrelid=27666; UPDATE 1 # UPDATE pg_attribute SET attnum=1 WHERE attname='b' AND attrelid=27666; UPDATE 1 # UPDATE pg_attribute SET attnum=2 WHERE attname='a' AND attrelid=27666; UPDATE 1 # SELECT * FROM test; b | a | c ---+---+--- 1 | 2 | 3 (1 row)
同样,因为这是在使用数据库系统表,如果您觉得确实需要这样做,请格外小心.
这与postgres 8.3一样,对于以前的版本,你的milage可能会有所不同.
如果您的数据库不是很大并且您可以承受一些停机时间,那么您可以:
禁用对数据库的写访问权限
这是必不可少的,否则在开始下一个点之后的任何更改都将丢失
pg_dump --create --column-inserts databasename > databasename.pgdump.sql
编辑CREATE TABLE
databasename.pgdump.sql中的适当语句
如果文件对于编辑器来说太大,只需使用split
命令将其拆分,编辑,然后使用汇编回来cat
drop database databasename
你有最近的备份,为了以防万一,你呢?
psql --single-transaction -f databasename.pgdump.sql
如果你不使用--single-transaction
它会很慢
如果使用所谓的大对象,请确保它们包含在转储中.我不确定它们是否默认为8.1.
我在2007年的pgsql-admin中提出了这个问题.Tom Lane本人宣称改变目录中的顺序实际上是不可行的.
http://archives.postgresql.org/pgsql-admin/2007-06/msg00037.php
澄清:对于用户,使用现有工具.不代表,它无法实施.IMO,它应该是.
对于Postgres 11来说仍然如此.