¿Cómo cambio el nombre de una columna en una tabla de base de datos SQLite?

Resuelto joce asked hace 15 años • 16 respuestas

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.

joce avatar Apr 30 '09 11:04 joce
Aceptado

Tenga en cuenta que a partir de la versión 3.25.0 lanzada en septiembre de 2018, ahora puede utilizarla ALTER TABLEpara cambiar el nombre de una columna .

Ejemplo para cambiar el nombre Really Bad : Column Namea 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.

Evan avatar Apr 30 '2009 05:04 Evan

Esto se acaba de solucionar con 2018-09-15 (3.25.0)

Mejoras el ALTER TABLEcomando:

  • Agregue soporte para cambiar el nombre de las columnas dentro de una tabla usando ALTER TABLEtable RENAME 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 TOsintaxis 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 se RENAME COLUMNproducirá un error y no se aplicarán cambios.

ingrese la descripción de la imagen aquí 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.

Lukasz Szozda avatar Sep 15 '2018 15:09 Lukasz Szozda

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!

joce avatar Apr 30 '2009 05:04 joce

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.

ALTERAR LA SINTaxis DE LA TABLA

Noah avatar Jul 13 '2011 18:07 Noah