Як я можу правильно перейменувати таблицю в БД 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 DB Manager має такі ефекти:

  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, що означає, що багато ГІС не бачать таблицю як просторовий шар.
  2. Не перейменовує тригери. Визначення тригера частково модифіковане так, що BEFORE [INSERT|UPDATE|DELETE]посилається на нову назву таблиці, але умова все ще шукає старе ім'я в geometry_columns.
  3. Не перейменовує просторові індекси. Не впевнений, що це має значення, оскільки тригери все ще посилаються на старі іменні індекси.

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


3
Я думаю, що в «Диспетчері таблиць» є велика потреба в перестановці, перейменуванні, видаленні полів тощо в SpatiaLite, якщо ми колись хочемо позбутися файлів форми. Але, з невідомих причин, наскільки я не знаю, немає такого інструменту, який би допомагав нам у цьому. Буде може бути хорошим проектом для ініціативи фінансування натовпу!
Бернд В.

Яку версію просторіту-гуї у вас є?
користувач30184

SpatiaLite-GUI 1.7.1.
Лі Хачадоріан

Відповіді:


2

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

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


Зауважте, що питання стосується перейменування таблиць , а не стовпців . На пов'язаній сторінці обговорюється ALTER TABLEтвердження, але питання вже стосується того, чому це недостатньо для просторової бази даних.
Лі Хачадоріан

Переглянувши це далі, враховуючи ваш коментар, я не думаю, що існує адекватний спосіб зробити це і підтримувати тригери та інші структурні компоненти. Здавалося б, вам потрібно буде переписати код або коли ви збираєтесь експортувати таблицю (якщо ви плануєте це робити), використовуйте інше ім’я в db-менеджері QGIS.
Юлія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.