243 votos

¿Cómo cambiar una columna de una tabla de base de datos SQLite?

Yo tendría que cambiar el nombre de un par de columnas en algunas tablas en una base de datos SQLite. Sé que una pregunta similar, ha sido preguntado en stackoverflow anteriormente, pero era para SQL en general, y en el caso de SQLite no fue mencionado.

Desde el SQLite documentación para ALTER TABLE, deduzco que no es posible hacer tal cosa "fácilmente" (es decir. una sola instrucción ALTER TABLE).

Me preguntaba alguien que sabía de un SQL genérico manera de hacer tal cosa con SQLite.

419voto

Evan Puntos 9261

Supongamos que tenemos una tabla y la necesidad de cambiar el nombre de "colby" a "col_b":

Primero cambia el nombre de la tabla anterior:

ALTER TABLE orig_table_name RENAME TO tmp_table_name;

Luego de crear la nueva tabla, basándose en la tabla anterior, pero con la actualización del nombre de la columna:

CREATE TABLE orig_table_name (
  col_a INT
, col_b INT
);

A continuación, copiar el contenido a través de la tabla original.

INSERT INTO orig_table_name(col_a, col_b)
SELECT col_a, colb
FROM tmp_table_name;

Por último, la caída de la mesa de edad.

DROP TABLE tmp_table_name;

Envolver todo esta en un BEGIN TRANSACTION; y COMMIT; también es probablemente una buena idea.

52voto

Noah Puntos 7332

Si bien es cierto que no hay ningún ALTER COLUMN, si sólo desea cambiar el nombre de la columna, la caída de la restricción not NULL, o cambiar el tipo de datos, puede utilizar el siguiente conjunto de comandos:

Nota: Estos comandos tienen el potencial de dañar la base de datos, así que asegúrese de que usted tiene 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;

Usted tendrá que cerrar y volver a abrir la conexión en vacío o en la base de datos para 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**  

**REFERENCES FOLLOW:**
<hr>

[pragma schema_version](http://www.sqlite.org/pragma.html#pragma_schema_version)  
When this pragma is on, the SQLITE_MASTER tables in which database can be changed using ordinary UPDATE, INSERT, and DELETE statements. Warning: misuse of this pragma can easily result in a corrupt database file.

[alter table](From http://www.sqlite.org/lang_altertable.html)  
SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table. 

![ALTER TABLE SYNTAX][1]

50voto

Joce Puntos 3720

Escarbando, he encontrado esto multiplataforma (Linux | Mac | Herramienta gráfica Windows) llamado SQLite Database Browser (sexy!) que en realidad le permite cambiar el nombre de las columnas en un muy fácil de usar modo!

Editar | Modificar la tabla | Seleccione Tabla | Edite el campo. Haga clic! ¡ Y listo!

Sin embargo, si alguien quiere compartir una forma programática de hacerlo, estaría feliz de saber!

17voto

aizquier Puntos 158

Recientemente tuve que hacerlo en SQLite3 con una tabla denominada puntos con el colunms id, lon, lat. Erroneusly, cuando la mesa fue importada, los valores de latitud donde almacenado en la columna de lon y viceversa, así que una solución obvia sería cambiar el nombre de las columnas. Así que el truco era:

create table points_tmp as select id, lon as lat, lat as lon from points;
drop table points;
alter table points_tmp rename to points;

Espero que esto sería útil para usted!

10voto

Elazar Leibovich Puntos 9396

Citando el sqlite documentación:

SQLite admite un subconjunto limitado de ALTER TABLE. El comando ALTER TABLE en SQLite permite al usuario cambiar el nombre de un tabla o para agregar una nueva columna a una tabla existente. No es posible cambiar el nombre de una columna, eliminar una columna, o añadir o eliminar las restricciones de una tabla.

Lo que usted puede hacer es, por supuesto, crear una tabla nueva con el nuevo diseño, SELECT * FROM old_table, y llenar la nueva tabla con los valores que va a recibir.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X