Ist es möglich, die natürliche Reihenfolge der Spalten in Postgres zu ändern?

StackOverflow https://stackoverflow.com/questions/126430

  •  02-07-2019
  •  | 
  •  

Frage

Ist es möglich, die natürliche Reihenfolge der Spalten in Postgres 8.1?

ändern

Ich weiß, dass Sie nicht auf Spaltenreihenfolge verlassen sollte - es ist nicht wesentlich zu dem, was ich tue - ich habe es nur noch einige automatisch generierten Dateien in einer Art und Weise kommen zu machen, dass mehr erfreulich, so dass das Feld Reihenfolge entspricht den ganzen Weg durch das hintere Ende von pgAdmin und auf das vordere Ende.

War es hilfreich?

Lösung

Sie können tatsächlich nur gerade nach oben die Spaltenreihenfolge ändern, aber ich würde es kaum empfehlen, und Sie sollten sehr vorsichtig sein, wenn Sie sich entscheiden, es zu tun.

zB.

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

Jetzt für die knifflige Bit, müssen Sie Ihre Datenbank mit dem Postgres-Benutzer verbinden, so dass Sie die Systemtabellen ändern können.

# 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 ist eine eindeutige Spalte, so müssen Sie einen temporären Wert verwenden, wenn Sie die Spaltennummern als solche sind zu modifizieren:

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

Auch, weil dieses Spiel mit Datenbank-Systemtabellen ist um, extreme Vorsicht walten, wenn Sie glauben Sie das wirklich tun müssen, um.

Dies funktioniert wie von Postgres 8.3 mit früheren Versionen können Sie Ihre milage variiert.

Andere Tipps

Wenn Ihre Datenbank nicht sehr groß ist und Sie können einige Ausfallzeiten leisten, dann können Sie:

  1. Deaktivieren Schreibzugriff auf die Datenbank
    Dies ist wichtig, da sonst alle Änderungen nach dem nächsten Punkt beginnen werden
  2. verloren
  3. pg_dump --create --column-inserts databasename > databasename.pgdump.sql
  4. Bearbeiten apropriate CREATE TABLE Anweisung in databasename.pgdump.sql
    Wenn die Datei für den Editor zu groß ist geteilt es nur mit split Befehl, zu bearbeiten, dann montieren zurück cat mit
  5. drop database databasename
    Sie haben eine aktuelle Sicherung haben, nur für den Fall, tun Sie?
  6. psql --single-transaction -f databasename.pgdump.sql
    Wenn Sie nicht --single-transaction verwenden wird es sehr langsam sein

Wenn Sie so große Objekte stellen Sie sicher, riefen sie im Dump enthalten sind. Ich bin mir nicht sicher, ob sie in 8.1 standardmäßig sind.

Ich habe diese Frage in pgsql-admin 2007 Tom Lane fragte sich, erklärte er praktisch undurchführbar die Reihenfolge in den Katalogen zu ändern.

Zur Verdeutlichung: für Benutzer, mit den vorliegenden Werkzeugen. Das bedeutet nicht, es kann nicht umgesetzt werden. IMO, sollte es sein.
Noch gilt für Postgres 11.

Wie die anderen Antworten erwähnt, können Sie die Reihenfolge der Spalten nicht ändern, das ist bis zu Postgres. Sie können (und sollten!) Ihr Problem mit Blick lösen. Für die Zwecke des Berichts Abfrage, wird es aussehen wie ein Tisch. So etwas wie:

create view my_view as
  select * from my_table
  order by some_col;

in der Abfrage die Spaltenreihenfolge angeben ist die einzige zuverlässige (und gesund) Art und Weise . Das heißt, können Sie in der Regel eine andere Bestellung erhalten, indem die Tabelle zu verändern, wie im Beispiel unten als die Spalten dargestellt sind in der Regel in der Reihenfolge zurückgegeben (nicht zu garantiert) sie in der Tabelle hinzugefügt wurden.

postgres=# create table a(a int, b int, c int);
CREATE TABLE
postgres=# insert into a values (1,2,3);
INSERT 0 1
postgres=# select * from a;
 a | b | c
---+---+---
 1 | 2 | 3
(1 row)

postgres=# alter table a add column a2 int;
ALTER TABLE
postgres=# select * from a;
 a | b | c | a2
---+---+---+----
 1 | 2 | 3 |
(1 row)

postgres=# update a set a2 = a;
UPDATE 1
postgres=# alter table a drop column a;
ALTER TABLE
postgres=# alter table a rename column a2 to a;
ALTER TABLE
postgres=# select * from a;
 b | c | a
---+---+---
 2 | 3 | 1
(1 row)

postgres=#

Leider nein, es ist nicht. Spaltenreihenfolge ist völlig bis zu Postgres.

Sie können die Reihenfolge der Spalten, die Sie wollen, indem eine neue Tabelle erstellt und Spalten der alten Tabelle in der Reihenfolge der Auswahl, dass Sie sie präsentieren wollen:

CREATE TABLE test_new AS SELECT b, c, a FROM test;
SELECT * from test_new;
 b | c | a 
---+---+---
 2 | 3 | 1
(1 row)

Beachten Sie, dass diese Kopien nur Daten, nicht Modifikatoren, Einschränkungen, Indizes, etc ..

Sobald die neue Tabelle geändert wird, wie Sie wollen, das Original löschen und ändern Sie den Namen der neuen:

BEGIN;
DROP TABLE test;
ALTER TABLE test_new RENAME TO test;
COMMIT;

Ich will das gleiche. Ja, bestellen Sie es jetzt wichtig, aber es reibt mir nur in die falsche Richtung:)

Was ich tue, um es zu lösen ist wie folgt.

Diese Methode stellt sicher, Sie alle vorhandenen Daten HALTEN,

  1. Erstellen Sie eine neue Version der Tabelle mit der Bestellung Ich möchte, einen temporären Namen.
  2. Geben Sie alle Daten in dieser neuen Tabelle aus der bestehenden.
  3. Löschen Sie die alte Tabelle.
  4. Benennen Sie die neue Tabelle in die „richtigen Namen“ von „temporären Namen“.
  5. Re-fügen Sie alle Indizes, die Sie vorher hatten.
  6. Reset-ID-Sequenz für Primärschlüssel-Schritte.

Aktuelle Tabellenreihenfolge:

id, name, email

1. Erstellen Sie eine neue Version der Tabelle mit der Bestellung Ich möchte, einen temporären Namen.

In diesem Beispiel möchte ich email vor name sein.

CREATE TABLE mytable_tmp
(
  id SERIAL PRIMARY KEY,
  email text,
  name text
);

2. Legen Sie alle Daten in diese neue Tabelle aus dem bestehenden.

INSERT INTO mytable_tmp   --- << new tmp table
(
  id
, email
, name
)
SELECT
  id
, email
, name
FROM mytable;  --- << this is the existing table

3. Löschen Sie die alte Tabelle.

DROP TABLE mytable;

4. Benennen Sie die neue Tabelle in die „richtigen Namen“ von „temporären Namen“.

ALTER TABLE mytable_tmp RENAME TO mytable;

5. Re-fügen Sie alle Indizes, die Sie vorher hatten.

CREATE INDEX ...

6. Zurücksetzen ID-Sequenz für Primärschlüssel-Schritte.

SELECT setval('public.mytable_id_seq', max(id)) FROM mytable;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top