sql >> Databasteknik >  >> RDS >> PostgreSQL

Är det möjligt att ändra den naturliga ordningen på kolumner i Postgres?

Du kan faktiskt bara ändra kolumnordningen direkt, men jag skulle knappast rekommendera det, och du bör vara mycket försiktig om du bestämmer dig för att göra det.

t.ex.

# 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 för det knepiga, du måste ansluta till din databas med postgres-användaren så att du kan ändra systemtabellerna.

# 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 är en unik kolumn, så du måste använda ett tillfälligt värde när du ändrar kolumnnumren som sådana:

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

Återigen, eftersom det här leker med databassystemtabeller, var extremt försiktig om du känner att du verkligen behöver göra detta.

Detta fungerar från och med postgres 8.3, med tidigare versioner kan din körsträcka variera.



  1. SQL Server-markörtyper - KEYSET-markör | SQL Server Tutorial / TSQL Tutorial

  2. MySQL Performance Cheat Sheet

  3. rake db:create throws databas finns inte fel med postgresql

  4. Hur man väljer data från en tabell från en annan databas i SQL Server?