Necesitaría cambiar el nombre de algunas columnas en algunas tablas en una base de datos SQLite. Sé que se ha hecho una pregunta similar en stackoverflow anteriormente, pero fue para SQL en general, y el caso de SQLite no se mencionó.
De la documentación de SQLite para ALTER TABLE , deduzco que no es posible hacer tal cosa "fácilmente" (es decir, una sola declaración ALTER TABLE).
Me preguntaba si alguien sabía de una forma genérica de SQL de hacer tal cosa con SQLite.
sqlite
alter-table
joce
fuente
fuente
Respuestas:
Esto solo se solucionó con 2018-09-15 (3.25.0)
Puede encontrar la nueva sintaxis documentada en
ALTER TABLE
Fuente de la imagen: https://www.sqlite.org/images/syntax/alter-table-stmt.gif
Ejemplo:
demo db-fiddle.com
Soporte de Android
Al momento de escribir, la API 27 de Android está utilizando el paquete SQLite versión 3.19 .
Basado en la versión actual que está usando Android y que esta actualización viene en la versión 3.25.0 de SQLite, diría que tiene que esperar un poco (aproximadamente API 33) antes de que se agregue soporte para Android.
Y, aun así, si necesita admitir versiones anteriores a la API 33, no podrá usar esto.
fuente
database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")
. COLUM está resaltado en rojo y dice TO esperado, obtuvo 'COLUMNA' . Desafortunadamente, Android todavía está en SQLite versión 3.19, por lo que esto no funciona para mí.Digamos que tiene una tabla y necesita cambiar el nombre de "colb" a "col_b":
Primero cambia el nombre de la tabla anterior:
Luego cree la nueva tabla, basada en la tabla anterior pero con el nombre de la columna actualizada:
Luego copie el contenido de la tabla original.
Por último, deja caer la vieja mesa.
Envolver todo esto en un
BEGIN TRANSACTION;
yCOMMIT;
también es probablemente una buena idea.fuente
.schema
comando de SQLite es útil para mostrar laCREATE TABLE
declaración que hace la tabla existente. Puede tomar su salida, modificarla según sea necesario y ejecutarla para crear la nueva tabla. Este comando también muestra losCREATE INDEX
comandos necesarios para crear los índices, que deben cubrir las preocupaciones de Thomas. Por supuesto, asegúrese de ejecutar este comando antes de modificar cualquier cosa.Al buscar, encontré esta herramienta gráfica multiplataforma (Linux | Mac | Windows) llamada DB Browser para SQLite que en realidad permite cambiar el nombre de las columnas de una manera muy fácil de usar.
Editar | Modificar tabla | Seleccionar tabla | Editar campo. ¡Clic clic! Voila!
Sin embargo, si alguien quiere compartir una forma programática de hacer esto, ¡me encantaría saberlo!
fuente
Si bien es cierto que no hay ALTER COLUMN, si solo desea cambiar el nombre de la columna, descartar la restricción NOT NULL o cambiar el tipo de datos, puede usar el siguiente conjunto de comandos:
Nota: estos comandos tienen el potencial de dañar su base de datos, así que asegúrese de tener una copia de seguridad
Deberá cerrar y volver a abrir su conexión o aspirar la base de datos para volver a cargar los cambios en el esquema.
Por ejemplo:
REFERENCIAS SIGUEN:
pragma writable_schema
Cuando este pragma está activado, las tablas SQLITE_MASTER en las que la base de datos se puede cambiar utilizando las instrucciones ordinarias UPDATE, INSERT y DELETE. Advertencia: el mal uso de este pragma puede resultar fácilmente en un archivo de base de datos corrupto.
alter table
SQLite admite un subconjunto limitado de ALTER TABLE. El comando ALTER TABLE en SQLite permite al usuario cambiar el nombre de una tabla o agregar una nueva columna a una tabla existente. No es posible cambiar el nombre de una columna, eliminar una columna o agregar o eliminar restricciones de una tabla.
fuente
Recientemente tuve que hacer eso en SQLite3 con una tabla llamada puntos con los colunms id, lon, lat . Por error, cuando se importó la tabla, los valores de latitud se almacenaron en la columna lon y viceversa, por lo que una solución obvia sería cambiar el nombre de esas columnas. Entonces el truco fue:
¡Espero que esto te sea útil!
fuente
Citando la documentación de sqlite :
Lo que puede hacer, por supuesto, es crear una nueva tabla con el nuevo diseño
SELECT * FROM old_table
y llenar la nueva tabla con los valores que recibirá.fuente
En primer lugar, esta es una de esas cosas que me golpea en la cara con sorpresa: cambiar el nombre de una columna requiere crear una tabla completamente nueva y copiar los datos de la tabla anterior a la nueva tabla ...
La GUI en la que he aterrizado para hacer operaciones SQLite es Base . Tiene una ingeniosa ventana de registro que muestra todos los comandos que se han ejecutado. Hacer un cambio de nombre de una columna a través de Base llena la ventana de registro con los comandos necesarios:
Estos se pueden copiar y pegar fácilmente donde los necesite. Para mí, eso está en un archivo de migración ActiveAndroid . Un buen detalle también es que los datos copiados solo incluyen los comandos SQLite, no las marcas de tiempo, etc.
Con suerte, eso ahorra tiempo a algunas personas.
fuente
BEGIN TRANSACTION;
yCOMMIT;
, ya que ActiveAndroid lo maneja por sí mismo.CASO 1: SQLite 3.25.0+
Solo la versión 3.25.0 de SQLite admite cambiar el nombre de las columnas. Si su dispositivo cumple con este requisito, las cosas son bastante simples. La siguiente consulta resolvería su problema:
CASO 2: SQLite Versiones anteriores
Tienes que seguir un enfoque diferente para obtener el resultado, que puede ser un poco complicado
Por ejemplo, si tiene una tabla como esta:
Y si deseas cambiar el nombre de la columna
Location
Paso 1: cambie el nombre de la tabla original:
Paso 2: ahora cree una nueva tabla
student
con el nombre de columna correcto:Paso 3: copie los datos de la tabla original a la nueva tabla:
Nota: El comando anterior debe ser una sola línea.
Paso 4: suelte la tabla original:
Con estos cuatro pasos puede cambiar manualmente cualquier tabla SQLite. Tenga en cuenta que también necesitará recrear cualquier índice, visor o activador en la nueva tabla.
fuente
cambiar la columna de la tabla <id> a <_id>
fuente
Cree una nueva columna con el nombre de columna deseado: COLNew.
Copie el contenido de la antigua columna COLOld a la nueva columna COLNew.
Nota: los corchetes son necesarios en la línea anterior.
fuente
Como se mencionó anteriormente, hay una herramienta SQLite Database Browser, que hace esto. Afortunadamente, esta herramienta mantiene un registro de todas las operaciones realizadas por el usuario o la aplicación. Al hacer esto una vez y mirar el registro de la aplicación, verá el código involucrado. Copie la consulta y péguela según sea necesario. Trabajó para mi. Espero que esto ayude
fuente
De la documentación oficial.
Opcionalmente, se puede utilizar un procedimiento más simple y más rápido para algunos cambios que no afectan el contenido del disco de ninguna manera. El siguiente procedimiento más simple es apropiado para eliminar las restricciones CHECK o FOREIGN KEY o NOT NULL, cambiar el nombre de las columnas o agregar o eliminar o cambiar los valores predeterminados en una columna.
Comience una transacción.
Ejecute PRAGMA schema_version para determinar el número de versión del esquema actual. Este número será necesario para el paso 6 a continuación.
Active la edición de esquemas usando PRAGMA writable_schema = ON.
Ejecute una instrucción UPDATE para cambiar la definición de la tabla X en la tabla sqlite_master: UPDATE sqlite_master SET sql = ... WHERE type = 'table' AND name = 'X';
Precaución: Realizar un cambio en la tabla sqlite_master de esta manera hará que la base de datos esté corrupta e ilegible si el cambio contiene un error de sintaxis. Se sugiere que las pruebas cuidadosas de la declaración ACTUALIZACIÓN se realicen en una base de datos en blanco separada antes de usarla en una base de datos que contenga datos importantes.
Si el cambio a la tabla X también afecta a otras tablas o índices, o los desencadenantes son vistas dentro del esquema, entonces ejecute las instrucciones ACTUALIZAR para modificar esos índices y vistas de otras tablas también. Por ejemplo, si cambia el nombre de una columna, se deben modificar todas las restricciones, desencadenantes, índices y vistas de FOREIGN KEY que se refieren a esa columna.
Precaución: una vez más, realizar cambios en la tabla sqlite_master como esta hará que la base de datos se corrompa e ilegible si el cambio contiene un error. Pruebe cuidadosamente todo este procedimiento en una base de datos de prueba separada antes de usarlo en una base de datos que contenga datos importantes y / o haga copias de seguridad de bases de datos importantes antes de ejecutar este procedimiento.
Incremente el número de versión del esquema utilizando PRAGMA schema_version = X donde X es uno más que el número de versión del esquema anterior que se encuentra en el paso 2 anterior.
Deshabilite la edición de esquemas usando PRAGMA writable_schema = OFF.
(Opcional) Ejecute PRAGMA integridad_check para verificar que los cambios en el esquema no dañaron la base de datos.
Confirme la transacción iniciada en el paso 1 anterior.
fuente
Una opción, si necesita hacerlo en un apuro, y si su columna inicial se creó con un valor predeterminado, es crear la nueva columna que desee, copiar el contenido y básicamente "abandonar" la columna anterior (permanece presente, pero simplemente no lo usa / actualiza, etc.)
ex:
Esto deja una columna (y si se creó con NOT NULL pero sin un valor predeterminado, las inserciones futuras que lo ignoren podrían fallar), pero si se trata solo de una tabla desechable, las compensaciones podrían ser aceptables. De lo contrario, use una de las otras respuestas mencionadas aquí, o una base de datos diferente que permita cambiar el nombre de las columnas.
fuente
Desde la versión 2018-09-15 (3.25.0) sqlite admite renombrar columnas
https://sqlite.org/changes.html
fuente
sqlite3 yourdb .dump> /tmp/db.txt
editar /tmp/db.txt cambiar el nombre de la columna en Crear línea
sqlite2 yourdb2 </tmp/db.txt
mv / move yourdb2 yourdb
fuente