是否可以改变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一起工作,与以前的版本,你的口味可能会有所不同。