Próbowałem następujących rzeczy, ale nie udało mi się:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Próbowałem następujących rzeczy, ale nie udało mi się:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Odpowiedzi:
„ Zmień pozycję kolumny ” na Wiki PostgreSQL mówi:
PostgreSQL obecnie definiuje kolejność kolumn na podstawie
attnum
kolumnypg_attribute
tabeli. Jedynym sposobem zmiany kolejności kolumn jest ponowne utworzenie tabeli lub dodanie kolumn i obracanie danych, aż osiągniesz żądany układ.
To dość słabe, ale w ich obronie, w standardowym języku SQL, również nie ma rozwiązania do zmiany pozycji kolumny. Marki baz danych, które obsługują zmianę pozycji porządkowej kolumny, definiują rozszerzenie składni SQL.
Przychodzi mi do głowy jeszcze jeden pomysł: możesz zdefiniować a, VIEW
który określa kolejność kolumn, tak jak lubisz, bez zmiany fizycznego położenia kolumny w tabeli bazowej.
W PostgreSQL podczas dodawania pola zostanie dodane na końcu tabeli. Jeśli wtedy musimy wstawić w określonej pozycji
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;
Ten post jest stary i prawdopodobnie rozwiązany, ale miałem ten sam problem. Rozwiązałem to, tworząc widok oryginalnej tabeli określający nową kolejność kolumn.
Stąd mogłem użyć widoku lub utworzyć nową tabelę z widoku.
UTWÓRZ WIDOK original_tab_vw AS SELECT a.col1, a.col3, a.col4, a.col2 FROM original_tab a GDZIE a.col1 NIE JEST NULL - lub cokolwiek
SELECT * INTO new_table FROM original_tab_vw
Zmień nazwę lub usuń oryginalną tabelę i ustaw nazwę nowej tabeli na starą.
Jedna, aczkolwiek niezręczna opcja zmiany kolejności kolumn, gdy kolejność kolumn musi zostać bezwzględnie zmieniona, a klucze obce są w użyciu, to najpierw zrzucić całą bazę danych z danymi, a następnie zrzucić tylko schemat ( pg_dump -s databasename > databasename_schema.sql
). Następnie edytuj plik schematu, aby zmienić układ kolumn zgodnie z potrzebami, a następnie ponownie utwórz bazę danych ze schematu, a na koniec przywróć dane do nowo utworzonej bazy danych.
Myślę, że obecnie nie możesz: zobacz ten artykuł na wiki Postgresql .
Trzy obejścia tego artykułu to:
Otwórz tabelę w PGAdmin iw okienku SQL na dole skopiuj instrukcję SQL Create Table. Następnie otwórz Narzędzie do wysyłania zapytań i wklej. Jeśli tabela zawiera dane, zmień nazwę tabeli na „nowa_nazwa”, jeśli nie, usuń komentarz „-” w wierszu Drop Table. Edytuj sekwencję kolumn zgodnie z wymaganiami. Zwróć uwagę na brakujący / zbędny przecinek w ostatniej kolumnie na wypadek, gdybyś go przeniósł. Wykonaj nowe polecenie SQL Create Table. Odśwież i ... voilà.
W przypadku pustych tabel na etapie projektowania ta metoda jest dość praktyczna.
W przypadku, gdy tabela zawiera dane, musimy również zmienić kolejność kolumn danych. To proste: użyj, INSERT
aby zaimportować starą tabelę do nowej wersji za pomocą:
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... gdzie c2
, c3
, c1
są kolumny c1
, c2
, c3
starej tabeli w swoich nowych stanowiskach. Pamiętaj, że w tym przypadku musisz użyć „nowej” nazwy dla edytowanej „starej” tabeli, w przeciwnym razie utracisz swoje dane . W przypadku, gdy nazwy kolumn są liczne, długie i / lub złożone, użyj tej samej metody, co powyżej, aby skopiować nową strukturę tabeli do edytora tekstu i utworzyć tam nową listę kolumn przed skopiowaniem jej do INSERT
instrukcji.
Po sprawdzeniu, że wszystko jest w porządku, DROP
użyj starej tabeli i zmień nazwę „nową” na „starą” ALTER TABLE new RENAME TO old;
i gotowe.
Pracowałem nad zmianą kolejności wielu tabel i nie chciałem ciągle pisać tych samych zapytań, więc stworzyłem skrypt, który zrobi to wszystko za mnie. Zasadniczo to:
pg_dump
pg_dump
zapytanie, aby utworzyć tabelę o zmienionej kolejności z danymiMożna go użyć, uruchamiając następujące proste polecenie:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
Drukuje sql, abyś mógł go zweryfikować i przetestować, to był duży powód, dla którego go oparłem pg_dump
. Możesz znaleźć repozytorium github tutaj .
Używam Django i wymaga kolumny id w każdej tabeli, jeśli nie chcesz mieć bólu głowy. Niestety byłem nieostrożny i moja tabela bp.geo_location_vague nie zawierała tego pola. Parafowałem małą sztuczkę. Krok 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
Krok 2: (bez tworzenia tabeli - tabela utworzy się automatycznie!)
SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw
Krok 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;
Ponieważ potrzebuję dużego pseudotypu seryjnego w tabeli. Po SELECT * w pg utworzy insetad bigserial typu bigint.
Krok 4: Teraz możemy usunąć widok, usunąć tabelę źródłową i zmienić nazwę nowej tabeli na starą nazwę. Sztuczka zakończyła się sukcesem.
Istnieje kilka obejść, które to umożliwiają:
Odtworzenie całego stołu
Utwórz nowe kolumny w bieżącej tabeli
Utwórz widok