2010-10-24 14 views
55

¿Cómo alterno la columna en sqlite? Esto está en PostgresqlALTER COLUMN en sqlite

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL; 

Creo que no hay ninguna columna ALTER en sqlite en absoluto, solamente se admite ALTER TABLE.

¿Alguna idea? ¡Gracias!

Respuesta

84

No hay ALTER COLUMN en sqlite.

Creo que su única opción es:

  • Cambiar nombre de la tabla a un nombre temporal
  • crear una nueva tabla sin la restricción NOT NULL
  • Copiar el contenido de la mesa de edad a la nueva uno
  • Retire la vieja mesa de

This other Stackoverflow answer explica el proceso en detalle

56

Si bien es cierto que la hay ninguna columna ALTER, si sólo desea cambiar el nombre de la columna, quitar la restricción NOT NULL, o cambiar el tipo de datos, puede utilizar el siguiente conjunto de comandos peligrosas:

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 aspirar la base de datos para volver a cargar los cambios en el esquema.

Por ejemplo:

Y:>sqlite3 booktest
versión 3.7.4 SQLite
Enter ".help" para obtener instrucciones
Introduzca sentencias SQL terminados con un ";"
sqlite>crear tabla LIBROS (título TEXTO NO NULO, fecha_publicación TEXTO NO NULO);
sqlite>insertar en VALORES DE LIBROS ("NULLTEST", nulo);
Error: BOOKS.publication_date puede no ser NULL
sqlite>PRAGMA writable_schema = 1;
sqlite>ACTUALIZACIÓN SQLITE_MASTER SET SQL = 'CREAR LIBROS DE TABLA (título TEXTO NO NULO, fecha_ publicación TEXTO)' DONDE NOMBRE = 'LIBROS';
sqlite>PRAGMA writable_schema = 0;
sqlite>.q

Y:>sqlite3 booktest
versión 3.7.4 SQLite
Enter".ayuda" para obtener instrucciones
Introduzca sentencias SQL terminados con un ";"
sqlite>inserción en los libros VALORES ("NULLTEST", null);
sqlite>.q

Referencias siga:


pragma writable_schema
Cuando esto Pragma está activada, las tablas de datos en la que sqlite_master la base se puede cambiar usando 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.

[alterar tabla] (De http://www.sqlite.org/lang_altertable.html)
SQLite soporta un subconjunto limitado de ALTER TABLE. El comando ALTER TABLE en SQLite le 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.

ALTER TABLE SYNTAX

+4

Este método ha funcionado para mí, aunque para evitar situaciones en las que las columnas pueden estar en un orden diferente (es decir, de un comando ADD COLUMN anterior), utilicé: UPDATE SQLITE_MASTER SET SQL = replace (SQL, '[MyColumn] entero NOT NULL', '[MyColumn] entero NULL') WHERE NAME = 'MyTable'. Además, tenga cuidado de no ejecutar esto como parte de una transacción: puede evitar la ejecución de algunos de los comandos de transacción anteriores. – Ross

28

SQLite soporta un subconjunto limitado de ALTER TABLE. El comando ALTER TABLE en SQLite le 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. Pero puede modificar el tipo de datos de la columna de la tabla u otra propiedad mediante los siguientes pasos.

  1. BEGIN TRANSACTION;
  2. CREAR CUADRO TEMPORAL t1_backup (a, b);
  3. INSERTAR EN t1_backup SELECCIONAR a, b FROM t1;
  4. DROP TABLE t1;
  5. CREAR TABLA t1 (a, b);
  6. INSERTAR EN t1 SELECCIONAR a, b FROM t1_backup;
  7. DROP TABLE t1_backup;
  8. COMMIT

Para más detalles se puede consultar la link.

+0

Para cambiar el nombre de la tabla: ALTER TABLE table1 RENAME TO table2; –

+0

No olvide los índices. Ejecute .schema para generar una declaración de creación con índices. –

4

Ninguna de las otras respuestas es incorrecta pero he encontrado que la manera más fácil de manejar ALTERs complicadas es a través de Sqliteman (FOSS).

Manejará el acto de malabarismo (como se describe en otras respuestas) para usted.

Seleccione la tabla books_book, a través del menú: Contexto> Modificar tabla: Quite la marca NULL> Alter, hecho

Ver Sqliteman Doc: Alter Table