实际上,您可以直接更改列顺序,但我几乎不推荐这样做,如果您决定这样做,则应该非常小心。
eg.
# 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 开始,此功能有效,对于之前的版本,您的情况可能会有所不同。