sql >> Database >  >> RDS >> PostgreSQL

Is het mogelijk om de natuurlijke volgorde van kolommen in Postgres te wijzigen?

Je kunt de kolomvolgorde gewoon rechtstreeks wijzigen, maar ik zou het nauwelijks aanbevelen, en je moet heel voorzichtig zijn als je besluit het te doen.

bijv.

# 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)

Nu, voor het lastige, moet u verbinding maken met uw database met behulp van de postgres-gebruiker, zodat u de systeemtabellen kunt wijzigen.

# 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 is een unieke kolom, dus u moet een tijdelijke waarde gebruiken wanneer u de kolomnummers als zodanig wijzigt:

# 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)

Nogmaals, want dit is spelen met databasesysteemtabellen, wees uiterst voorzichtig als u denkt dat dit echt nodig is.

Dit werkt vanaf postgres 8.3, met eerdere versies kan uw kilometerstand variëren.



  1. Asynchrone replicatie Automatische failover in MySQL 8.0.22

  2. Krijg tellingen van alle tabellen in een schema

  3. Hoe dubbele rijen in SQL te elimineren

  4. Hoe een standalone Moodle te migreren naar een schaalbare configuratie van een geclusterde database