¿Cómo cambio el nombre de una columna en una tabla de base de datos SQLite?
Necesitaría cambiar el nombre de algunas columnas en algunas tablas de una base de datos SQLite. Sé que anteriormente se hizo una pregunta similar en stackoverflow, pero era para SQL en general, y no se mencionó el caso de SQLite.
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 que alguien conocía una forma SQL genérica de hacer tal cosa con SQLite.
Tenga en cuenta que a partir de la versión 3.25.0 lanzada en septiembre de 2018, ahora puede utilizarla ALTER TABLE
para cambiar el nombre de una columna .
Ejemplo para cambiar el nombre Really Bad : Column Name
a BetterColumnName
:
ALTER TABLE your_table
RENAME COLUMN "Really Bad : Column Name" TO BetterColumnName
Según las palabras clave el uso de "double-quotes"
es la forma estándar
La respuesta original "crear una nueva y eliminar una tabla antigua" a continuación.
Supongamos que tiene una tabla y necesita cambiar el nombre de "colb" a "col_b":
Primero cree la nueva tabla con un nombre temporal, basado en la definición de tabla anterior pero con el nombre de columna actualizado:
CREATE TABLE tmp_table_name (
col_a INT
, col_b INT
);
Luego copie el contenido frente a la tabla original.
INSERT INTO tmp_table_name(col_a, col_b)
SELECT col_a, colb
FROM orig_table_name;
Deja la vieja mesa.
DROP TABLE orig_table_name;
Por último, cambia el nombre de la tabla temporal al original:
ALTER TABLE tmp_table_name RENAME TO orig_table_name;
No olvide volver a crear índices, activadores, etc. La documentación brinda una imagen más completa de los errores y advertencias.
Envolver todo esto en un BEGIN TRANSACTION;
y COMMIT;
probablemente también sea una buena idea.
Esto se acaba de solucionar con 2018-09-15 (3.25.0)
Mejoras el
ALTER TABLE
comando:
- Agregue soporte para cambiar el nombre de las columnas dentro de una tabla usando
ALTER TABLE
tableRENAME COLUMN oldname TO newname
.- Se corrigió la función de cambio de nombre de tabla para que también actualice las referencias a la tabla renombrada en activadores y vistas.
Puede encontrar la nueva sintaxis documentada enALTER TABLE
La
RENAME COLUMN TO
sintaxis cambia el nombre de la columna de la tabla nombre-tabla al nombre-nueva-columna. El nombre de la columna se cambia tanto dentro de la definición de la tabla como también dentro de todos los índices, activadores y vistas que hacen referencia a la columna. Si el cambio de nombre de la columna daría como resultado una ambigüedad semántica en un disparador o vista, entonces seRENAME COLUMN
producirá un error y no se aplicarán cambios.
Fuente de la imagen: https://www.sqlite.org/images/syntax/alter-table-stmt.gif
Ejemplo:
CREATE TABLE tab AS SELECT 1 AS c;
SELECT * FROM tab;
ALTER TABLE tab RENAME COLUMN c to c_new;
SELECT * FROM tab;
demostración de db-fiddle.com
Soporte Android
Al momento de escribir este artículo, la API 27 de Android utiliza la versión 3.19 del paquete SQLite .
Según la versión actual que utiliza Android y que esta actualización llegará en la versión 3.25.0 de SQLite, diría que hay que esperar un poco (aproximadamente API 33) antes de que se agregue soporte para esto a Android.
E incluso entonces, si necesita admitir alguna versión anterior a la API 33, no podrá utilizarla.
Investigando, encontré esta herramienta gráfica multiplataforma (Linux | Mac | Windows) llamada DB Browser para SQLite que realmente permite cambiar el nombre de las columnas de una manera muy fácil de usar.
Editar | Modificar tabla | Seleccionar tabla | Editar campo. ¡Clic clic! ¡Voilá!
Sin embargo, si alguien quiere compartir una forma programática de hacer esto, ¡me encantaría saberlo!
Si bien es cierto que no existe ALTER COLUMN, si solo desea cambiar el nombre de la columna, eliminar 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
PRAGMA writable_schema = 1;
UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
PRAGMA writable_schema = 0;
Deberá cerrar y volver a abrir su conexión o vaciar la base de datos para volver a cargar los cambios en el esquema.
Por ejemplo:
Y:\> sqlite3 booktest
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT NULL);
sqlite> insert into BOOKS VALUES ("NULLTEST",null);
Error: BOOKS.publication_date may not be NULL
sqlite> PRAGMA writable_schema = 1;
sqlite> UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
sqlite> PRAGMA writable_schema = 0;
sqlite> .q
Y:\> sqlite3 booktest
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> insert into BOOKS VALUES ("NULLTEST",null);
sqlite> .q
A CONTINUACIÓN LAS REFERENCIAS:
pragma writable_schema
Cuando este pragma está activado, las tablas SQLITE_MASTER en las que se puede cambiar la base de datos mediante declaraciones ordinarias UPDATE, INSERT y DELETE. Advertencia: el mal uso de este pragma puede resultar fácilmente en un archivo de base de datos corrupto.
alterar tabla
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 ni agregar o eliminar restricciones de una tabla.