¿Cómo puedo cambiar el nombre de una tabla en una base de datos SpatiaLite?

11

Las capas espaciales (tablas) en SpatiaLite incluyen varios objetos de apoyo y metadatos, incluidos desencadenantes, índices y entradas en (como mínimo) la geometry_columnstabla. Estoy buscando (preferiblemente) una GUI que maneje todos los cambios necesarios de una vez, o la documentación (alternativa) de todos los cambios necesarios para no romper las capas espaciales.

Las tablas tienen:

  1. Entrada en geometry_columns.f_table_name.
  2. Cinco disparadores nombrados [prefix]_[table_name]_geometry, donde el prefijo indica si se trata de una reversión de transacción o actualización de índice.
  3. Tres índices espaciales llamados idx_[table_name]_geometry[_suffix]

He intentado esto en dos aplicaciones, QGIS DB Manager y SpatiaLite-GUI.

QGIS DB Manager parece tener los siguientes efectos:

  1. Se actualiza correctamente geometry_columnscon el nuevo nombre de la tabla
  2. No cambia el nombre de los desencadenantes. La definición del disparador se modifica parcialmente, de modo que se BEFORE [INSERT|UPDATE|DELETE]refiere al nuevo nombre de la tabla, pero la condición aún busca el nombre antiguo en geometry_columns.
  3. No renombra los índices espaciales. No estoy seguro de si esto es importante porque los desencadenantes aún se refieren a nombres de índice antiguos.

Cuando elige Mantenimiento → Cambiar nombre de tabla en SpatiaLite-GUI, solo obtiene el código auxiliar de una ALTER TABLEinstrucción SQL . Este es un SQL sencillo y hace incluso menos que QGIS DB Manager. Si completa el nuevo nombre de la tabla, la tabla se renombra. Otros efectos:

  1. La tabla no se renombra geometry_columns.f_table_name, lo que significa que muchos SIG no verán la tabla como una capa espacial.
  2. No cambia el nombre de los desencadenantes. La definición del disparador se modifica parcialmente, de modo que se BEFORE [INSERT|UPDATE|DELETE]refiere al nuevo nombre de la tabla, pero la condición aún busca el nombre antiguo en geometry_columns.
  3. No renombra los índices espaciales. No estoy seguro de si esto es importante porque los desencadenantes aún se refieren a nombres de índice antiguos.

Tenga en cuenta que Spatialite-GUI ofrece la opción de recuperar una columna de geometría que agrega la entrada correcta geometry_columns(pero requiere que especifique SRID, tipo de geometría y dimensiones), para construir o reconstruir un índice espacial y para recuperar disparadores, pero ninguno De estas funciones, se eliminan las filas, los desencadenantes o los índices de la tabla anterior, lo que lleva a una base de datos con una gran cantidad de (posiblemente inofensivo pero molesto) schmutz.

Lee Hachadoorian
fuente
3
Creo que existe una gran necesidad de un "Administrador de tablas" para reorganizar, renombrar, eliminar campos, etc. en SpatiaLite si alguna vez queremos deshacernos de los archivos de forma. Pero, por razones desconocidas, no existe tal herramienta que nos ayude con eso, que yo sepa. ¡Sería quizás un buen proyecto para una iniciativa de financiación colectiva!
Bernd V.
¿Qué versión de spatialite-gui tienes?
user30184
SpatiaLite-GUI 1.7.1.
Lee Hachadoorian

Respuestas:

2

Debe copiar la tabla con un nuevo nombre de tabla y cambiar el nombre de las columnas cuando copie los datos. Una función de administrador de tabla sería ideal para esto, pero aún no se ha creado para la interfaz gráfica de usuario. El siguiente enlace muestra información formal para esto con código de muestra en SQLite. SpatiaLite es parte de SQLite, por lo que la codificación es la misma. ¡Buena suerte!

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

Julia
fuente
Tenga en cuenta que la pregunta es sobre renombrar tablas , no columnas . La página vinculada discute la ALTER TABLEdeclaración, pero la pregunta ya aborda por qué esto es inadecuado para una base de datos espacial.
Lee Hachadoorian
Después de analizar esto más a fondo con su comentario en mente, no creo que haya una manera adecuada de hacer esto y mantener los desencadenantes y otros componentes estructurales. Parece que necesitaría volver a escribir el código o cuando vaya a exportar la tabla (si planea hacerlo), use un nombre diferente en el administrador de db en QGIS.
Julia