Jak poprawnie zmienić nazwę tabeli w SpatiaLite DB?

11

Warstwy przestrzenne (tabele) w SpatiaLite obejmują różne obiekty pomocnicze i metadane, w tym wyzwalacze, indeksy i wpisy w (przynajmniej) geometry_columnstabeli. Szukam (najlepiej) GUI, który obsłużyłby wszystkie niezbędne zmiany za jednym razem, lub (rezerwowej) dokumentacji wszystkich wymaganych zmian, aby nie złamać warstw przestrzennych.

Tabele mają:

  1. Wpis geometry_columns.f_table_name.
  2. Pięć nazwanych wyzwalaczy [prefix]_[table_name]_geometry, których prefiks wskazuje, czy jest to wycofanie transakcji czy aktualizacja indeksu.
  3. Trzy wymienione wskaźniki przestrzenne idx_[table_name]_geometry[_suffix]

Próbowałem tego w dwóch aplikacjach, QGIS DB Manager i SpatiaLite-GUI.

Pojawia się QGIS DB Manager ma następujące efekty:

  1. Poprawnie aktualizuje się geometry_columnso nową nazwę tabeli
  2. Nie zmienia nazwy wyzwalaczy. Definicja wyzwalacza jest częściowo zmodyfikowana, więc BEFORE [INSERT|UPDATE|DELETE]odnosi się do nowej nazwy tabeli, ale warunek nadal szuka starej nazwy w geometry_columns.
  3. Nie zmienia nazw indeksów przestrzennych. Nie jestem pewien, czy to ma znaczenie, ponieważ wyzwalacze nadal odnoszą się do starych nazw indeksów.

Po wybraniu Konserwacja → Zmień nazwę tabeli w SpatiaLite-GUI, otrzymujesz tylko skrót ALTER TABLEinstrukcji SQL . Jest to prosty SQL i działa nawet mniej niż QGIS DB Manager. Jeśli wpiszesz nową nazwę tabeli, nazwa tabeli zostanie zmieniona. Inne efekty:

  1. Nie można zmienić nazwy tabeli geometry_columns.f_table_name, co oznacza, że ​​wiele systemów GIS nie widzi tabeli jako warstwy przestrzennej.
  2. Nie zmienia nazwy wyzwalaczy. Definicja wyzwalacza jest częściowo zmodyfikowana, więc BEFORE [INSERT|UPDATE|DELETE]odnosi się do nowej nazwy tabeli, ale warunek nadal szuka starej nazwy w geometry_columns.
  3. Nie zmienia nazw indeksów przestrzennych. Nie jestem pewien, czy to ma znaczenie, ponieważ wyzwalacze nadal odnoszą się do starych nazw indeksów.

Zauważ, że GUI Spatialite daje opcję odzyskania kolumny geometrii, która dodaje poprawny wpis geometry_columns(ale wymaga określenia SRID, typu geometrii i wymiarów), budowy lub przebudowania indeksu przestrzennego oraz odzyskiwania wyzwalaczy, ale żaden z tych funkcji usuwa stare wiersze tabeli, wyzwalacze lub indeksy, prowadząc do DB z dużą ilością (być może nieszkodliwym, ale irytującym) schmutza.

Lee Hachadoorian
źródło
3
Myślę, że istnieje ogromna potrzeba „Menedżera tabel” do zmiany układu, zmiany nazwy, usuwania itp. Pól w SpatiaLite, jeśli kiedykolwiek chcemy pozbyć się plików kształtów. Ale z nieznanych powodów nie ma takiego narzędzia, które pomogłoby nam w tym, o ile mi wiadomo. Byłby to może dobry projekt na inicjatywę finansowania przez tłum!
Bernd V.
Którą wersję GUI przestrzennego posiadasz?
user30184,
SpatiaLite-GUI 1.7.1.
Lee Hachadoorian,

Odpowiedzi:

2

Musisz skopiować tabelę z nową nazwą tabeli i zmienić nazwy kolumn podczas kopiowania danych. Funkcja menedżera tabel byłaby do tego idealna, ale nie została jeszcze utworzona dla GUI. Link poniżej pokazuje formalne informacje na ten temat wraz z przykładowym kodem w SQLite. SpatiaLite jest częścią SQLite, więc kodowanie jest takie samo. Powodzenia!

https://blog.xojo.com/2013/12/04/renaming-columns-in-sqlite-tables/

Julia
źródło
Pamiętaj, że pytanie dotyczy zmiany nazwy tabel , a nie kolumn . Strona, do której prowadzi link, omawia to ALTER TABLEstwierdzenie, ale pytanie już dotyczy tego, dlaczego jest to nieodpowiednie dla przestrzennej bazy danych.
Lee Hachadoorian,
Po dokładniejszym przeanalizowaniu tego z myślą o twoim komentarzu nie sądzę, że istnieje odpowiedni sposób, aby to zrobić i utrzymać wyzwalacze i inne elementy strukturalne. Wydawałoby się, że trzeba będzie ponownie napisać kod lub gdy chcesz wyeksportować tabelę (jeśli planujesz to zrobić), użyj innej nazwy w menedżerze db w QGIS.
Julia,