Räumliche Ebenen (Tabellen) in SpatiaLite enthalten verschiedene unterstützende Objekte und Metadaten, einschließlich Trigger, Indizes und Einträge in (mindestens) der geometry_columns
Tabelle. Ich suche (vorzugsweise) eine GUI, die alle erforderlichen Änderungen auf einmal erledigt, oder eine (Fallback-) Dokumentation aller erforderlichen Änderungen, um die räumlichen Ebenen nicht zu beschädigen.
Tabellen haben:
- Eintrag in
geometry_columns.f_table_name
. - Fünf benannte Trigger
[prefix]_[table_name]_geometry
, wobei das Präfix angibt, ob es sich um ein Transaktions-Rollback oder eine Indexaktualisierung handelt. - Drei räumliche Indizes benannt
idx_[table_name]_geometry[_suffix]
Ich habe dies in zwei Anwendungen versucht, QGIS DB Manager und SpatiaLite-GUI.
Der angezeigte QGIS DB Manager hat folgende Auswirkungen:
- Aktualisiert korrekt
geometry_columns
mit neuem Tabellennamen - Benennt Trigger nicht um. Die Triggerdefinition wurde teilweise geändert, sodass sie
BEFORE [INSERT|UPDATE|DELETE]
auf den neuen Tabellennamen verweist. Die Bedingung sucht jedoch weiterhin nach dem alten Namen ingeometry_columns
. - Benennt räumliche Indizes nicht um. Ich bin mir nicht sicher, ob dies wichtig ist, da Trigger immer noch auf alte Indexnamen verweisen.
Wenn Sie in SpatiaLite-GUI Wartung → Tabelle umbenennen wählen, erhalten Sie nur den Stub einer SQL- ALTER TABLE
Anweisung. Dies ist unkompliziertes SQL und macht sogar weniger als QGIS DB Manager. Wenn Sie den neuen Tabellennamen eingeben, wird die Tabelle umbenannt. Andere Effekte:
- Die Tabelle wird nicht umbenannt
geometry_columns.f_table_name
, was bedeutet, dass viele GIS die Tabelle nicht als räumliche Ebene sehen. - Benennt Trigger nicht um. Die Triggerdefinition wurde teilweise geändert, sodass sie
BEFORE [INSERT|UPDATE|DELETE]
auf den neuen Tabellennamen verweist. Die Bedingung sucht jedoch weiterhin nach dem alten Namen ingeometry_columns
. - Benennt räumliche Indizes nicht um. Ich bin mir nicht sicher, ob dies wichtig ist, da Trigger immer noch auf alte Indexnamen verweisen.
Beachten Sie, dass die Spatialite-GUI die Option bietet, eine Geometriespalte wiederherzustellen, die den richtigen Eintrag hinzufügt geometry_columns
(Sie müssen jedoch SRID, Geometrietyp und Dimensionen angeben), einen räumlichen Index zu erstellen oder neu zu erstellen und Trigger wiederherzustellen, jedoch keine Von diesen Funktionen werden alte Tabellenzeilen, Trigger oder Indizes entfernt, was zu einer Datenbank mit viel (möglicherweise harmlosem, aber ärgerlichem) Schmutz führt.
quelle
Antworten:
Sie müssen die Tabelle mit einem neuen Tabellennamen kopieren und die Spalten umbenennen, wenn Sie die Daten kopieren. Eine Tabellenmanagerfunktion wäre dafür ideal, wurde aber noch nicht für die GUI erstellt. Der folgende Link zeigt einige formale Informationen dazu mit Beispielcode in SQLite. SpatiaLite ist ein Teil von SQLite, daher ist die Codierung dieselbe. Viel Glück!
https://blog.xojo.com/2013/12/04/renaming-columns-in-sqlite-tables/
quelle
ALTER TABLE
Aussage erörtert , aber in der Frage wird bereits angesprochen, warum dies für eine räumliche Datenbank nicht geeignet ist.