Как правильно переименовать таблицу в базе данных SpatiaLite?

11

Пространственные слои (таблицы) в SpatiaLite включают в себя различные вспомогательные объекты и метаданные, включая триггеры, индексы и записи в (как минимум) geometry_columnsтаблице. Я ищу (предпочтительно) графический интерфейс, который бы обрабатывал все необходимые изменения за один раз, или (откат) документации всех необходимых изменений, чтобы не нарушать пространственные слои.

Таблицы имеют:

  1. Вход в geometry_columns.f_table_name.
  2. Пять названных триггеров [prefix]_[table_name]_geometry, где префикс указывает, является ли это откатом транзакции или обновлением индекса.
  3. Три пространственных индекса названы idx_[table_name]_geometry[_suffix]

Я пробовал это в двух приложениях, QGIS DB Manager и SpatiaLite-GUI.

Диспетчер БД QGIS имеет следующие эффекты:

  1. Корректно обновляется geometry_columnsс новым именем таблицы
  2. Не переименовывает триггеры. Определение триггера частично изменено, так что оно BEFORE [INSERT|UPDATE|DELETE]ссылается на новое имя таблицы, но условие все еще ищет старое имя в geometry_columns.
  3. Не переименовывает пространственные показатели. Не уверен, что это имеет значение, потому что триггеры все еще ссылаются на старые имена индексов.

Когда вы выбираете Обслуживание → Переименовать таблицу в SpatiaLite-GUI, вы просто получаете заглушку оператора SQL ALTER TABLE. Это простой SQL и делает даже меньше, чем QGIS DB Manager. Если вы заполните новое имя таблицы, таблица будет переименована. Другие эффекты:

  1. Таблица вовсе не переименовываются в geometry_columns.f_table_name, что означает , что многие GISes не будут видеть таблицу в качестве пространственного слоя.
  2. Не переименовывает триггеры. Определение триггера частично изменено, так что оно BEFORE [INSERT|UPDATE|DELETE]ссылается на новое имя таблицы, но условие все еще ищет старое имя в geometry_columns.
  3. Не переименовывает пространственные показатели. Не уверен, что это имеет значение, потому что триггеры все еще ссылаются на старые имена индексов.

Обратите внимание, что Spatialite-GUI дает возможность восстановить столбец геометрии, который добавляет правильную запись geometry_columns(но требует указания SRID, типа геометрии и размеров), построить или перестроить пространственный индекс и восстановить триггеры, но ни один из этих функций удаляются старые строки таблицы, триггеры или индексы, что приводит к созданию БД с большим количеством (возможно, безвредных, но раздражающих) ошибок.

Ли Хачадурян
источник
3
Я думаю, что существует большая потребность в «Диспетчере таблиц» для перестановки, переименования, удаления полей и т. Д. В SpatiaLite, если мы когда-нибудь захотим избавиться от файлов форм. Но, по неизвестным причинам, нет такого инструмента, который помог бы нам в этом, насколько я знаю. Возможно, это будет хороший проект для инициативы краудфандинга!
Бернд В.
Какая версия пространственного интерфейса у вас есть?
user30184 30.09.15
SpatiaLite-GUI 1.7.1.
Ли Хачадурян

Ответы:

2

Вам необходимо скопировать таблицу с новым именем таблицы и переименовать столбцы при копировании данных. Функция диспетчера таблиц была бы идеальной для этого, но еще не была создана для графического интерфейса. Ссылка ниже показывает некоторую формальную информацию для этого с примером кода в SQLite. SpatiaLite является частью SQLite, поэтому кодирование такое же. Удачи!

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

Юля
источник
Обратите внимание, что вопрос касается переименования таблиц , а не столбцов . На связанной странице обсуждается это ALTER TABLEутверждение, но уже задается вопрос, почему этого недостаточно для пространственной базы данных.
Ли Хачадурян
Рассмотрев это далее с учетом вашего комментария, я не думаю, что существует адекватный способ сделать это и сохранить триггеры и другие структурные компоненты. Казалось бы, вам нужно будет переписать код или, когда вы собираетесь экспортировать таблицу (если вы планируете это сделать), использовать другое имя в менеджере БД в QGIS.
Юлия