Ho provato quanto segue, ma non ho avuto successo:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Ho provato quanto segue, ma non ho avuto successo:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Risposte:
" Alter column position " nel Wiki di PostgreSQL dice:
PostgreSQL attualmente definisce l'ordine delle colonne in base alla
attnum
colonna dellapg_attribute
tabella. L'unico modo per modificare l'ordine delle colonne è ricreare la tabella o aggiungere colonne e ruotare i dati fino a raggiungere il layout desiderato.
È piuttosto debole, ma a loro difesa, nell'SQL standard, non esiste nemmeno una soluzione per riposizionare una colonna. I marchi di database che supportano la modifica della posizione ordinale di una colonna stanno definendo un'estensione della sintassi SQL.
Mi viene in mente un'altra idea: puoi definire un VIEW
che specifica l'ordine delle colonne come preferisci, senza cambiare la posizione fisica della colonna nella tabella di base.
In PostgreSQL, aggiungendo un campo sarebbe stato aggiunto alla fine della tabella. Se dobbiamo inserire in una posizione particolare, allora
alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;
Questo post è vecchio e probabilmente risolto ma ho avuto lo stesso problema. L'ho risolto creando una vista della tabella originale che specifica il nuovo ordine delle colonne.
Da qui potrei usare la vista o creare una nuova tabella dalla vista.
CREA VISTA original_tab_vw AS SELEZIONA a.col1, a.col3, a.col4, a.col2 FROM original_tab a DOVE a.col1 NON È NULLO o qualsiasi altra cosa
SELEZIONA * NELLA new_table FROM original_tab_vw
Rinomina o rilascia la tabella originale e imposta il nome della nuova tabella sulla vecchia tabella.
Una, sebbene un'opzione goffa per riorganizzare le colonne quando l'ordine delle colonne deve essere assolutamente modificato e le chiavi esterne sono in uso, è prima eseguire il dump dell'intero database con i dati, quindi eseguire il dump solo dello schema ( pg_dump -s databasename > databasename_schema.sql
). Quindi modifica il file dello schema per riorganizzare le colonne come desideri, quindi ricrea il database dallo schema e infine ripristina i dati nel database appena creato.
Non credo che tu possa al momento: vedi questo articolo sul wiki di Postgresql .
Le tre soluzioni alternative di questo articolo sono:
Aprire la tabella in PGAdmin e nel riquadro SQL in basso copiare l'istruzione SQL Create Table. Quindi apri lo Strumento di query e incolla. Se la tabella contiene dati, modificare il nome della tabella in "new_name", altrimenti eliminare il commento "-" nella riga Drop Table. Modificare la sequenza di colonne come richiesto. Attenzione alla virgola mancante / superflua nell'ultima colonna nel caso l'avessi spostata. Eseguire il nuovo comando SQL Crea tabella. Aggiorna e ... voilà.
Per le tabelle vuote in fase di progettazione questo metodo è abbastanza pratico.
Nel caso in cui la tabella contenga dati, è necessario riorganizzare anche la sequenza delle colonne dei dati. Questo è facile: usa INSERT
per importare la vecchia tabella nella sua nuova versione con:
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... dove c2
, c3
, c1
sono le colonne c1
, c2
, c3
della vecchia tabella nelle loro nuove posizioni. Tieni presente che in questo caso devi utilizzare un "nuovo" nome per la "vecchia" tabella modificata, altrimenti perderai i tuoi dati . Nel caso in cui i nomi delle colonne siano molti, lunghi e / o complessi, utilizzare lo stesso metodo di cui sopra per copiare la nuova struttura della tabella in un editor di testo e creare lì il nuovo elenco di colonne prima di copiarlo INSERT
nell'istruzione.
Dopo aver verificato che tutto sia a posto, DROP
la vecchia tabella cambia il nome "nuovo" in "vecchio" ALTER TABLE new RENAME TO old;
e il gioco è fatto.
Stavo lavorando al riordino di molte tabelle e non volevo dover scrivere le stesse query più e più volte, quindi ho creato uno script per fare tutto per me. In sostanza:
pg_dump
pg_dump
query originale per creare una tabella riordinata con i datiPuò essere utilizzato eseguendo il seguente semplice comando:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
Stampa lo sql in modo che tu possa verificarlo e testarlo, questo è stato un grande motivo su cui l'ho basato pg_dump
. Puoi trovare il repository GitHub qui .
Uso Django e richiede una colonna id in ogni tabella se non vuoi avere mal di testa. Sfortunatamente, sono stato distratto e la mia tabella bp.geo_location_vague non conteneva questo campo. Ho siglato un piccolo trucco. Passo 1:
CREATE VIEW bp.geo_location_vague_vw AS
SELECT
a.id, -- I change order of id column here.
a.in_date,
etc
FROM bp.geo_location_vague a
Passaggio 2: (senza creare tabella, la tabella creerà automaticamente!)
SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw
Passaggio 3:
CREATE SEQUENCE bp.tbl_tbl_id_seq;
ALTER TABLE bp.geo_location_vague_cp2 ALTER COLUMN id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE bp.tbl_tbl_id_seq OWNED BY bp.geo_location_vague_cp2.id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(id), 0)) FROM bp.geo_location_vague_cp2;
Perché ho bisogno di avere uno pseudotipo bigserial nella tabella. Dopo SELECT * in pg creerà il tipo bigint insetad bigserial.
passo 4: Ora possiamo eliminare la vista, rilasciare la tabella di origine e rinominare la nuova tabella con il vecchio nome. Il trucco è stato risolto con successo.
Ci sono alcune soluzioni alternative per renderlo possibile:
Ricreare l'intera tabella
Crea nuove colonne all'interno della tabella corrente
Crea una vista