Warstwy przestrzenne (tabele) w SpatiaLite obejmują różne obiekty pomocnicze i metadane, w tym wyzwalacze, indeksy i wpisy w (przynajmniej) geometry_columns
tabeli. 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ą:
- Wpis
geometry_columns.f_table_name
. - Pięć nazwanych wyzwalaczy
[prefix]_[table_name]_geometry
, których prefiks wskazuje, czy jest to wycofanie transakcji czy aktualizacja indeksu. - 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:
- Poprawnie aktualizuje się
geometry_columns
o nową nazwę tabeli - 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 wgeometry_columns
. - 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 TABLE
instrukcji 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:
- Nie można zmienić nazwy tabeli
geometry_columns.f_table_name
, co oznacza, że wiele systemów GIS nie widzi tabeli jako warstwy przestrzennej. - 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 wgeometry_columns
. - 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.
źródło
Odpowiedzi:
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/
źródło
ALTER TABLE
stwierdzenie, ale pytanie już dotyczy tego, dlaczego jest to nieodpowiednie dla przestrzennej bazy danych.