ALTER COLUMN en sqlite

81

¿Cómo modifico la columna en sqlite? Esto es enPostgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

Creo que no hay ALTER COLUMN en sqlite, solo se admite ALTER TABLE.

¿Alguna idea? ¡Gracias!

CppLearner
fuente
solicita una sintaxis ALTER COLUMN, pero no dice lo que quiere hacer. Eso me hace pensar que esto es demasiado amplio. ALTER COLUMN podría hacer mucho, ¿está buscando eliminar la restricción no nula como en el ejemplo de pg?
Evan Carroll
si utiliza las herramientas de intellj db, cuando cambie la columna generará los comandos para su sqlite.
foolcage

Respuestas:

111

No hay ALTER COLUMN en sqlite.

Creo que tu única opción es:

  • Cambiar el nombre de la tabla a un nombre temporal
  • Cree una nueva tabla sin la restricción NOT NULL
  • Copie el contenido de la tabla anterior a la nueva
  • Quita la mesa vieja

Esta otra respuesta de Stackoverflow explica el proceso en detalles

Alex Jasmin
fuente
64

Si bien es cierto que no es 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 peligrosos:

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**  

LAS REFERENCIAS SIGUEN:


pragma writable_schema
Cuando este pragma está activado, las tablas SQLITE_MASTER en las que la base de datos se puede cambiar usando las sentencias UPDATE, INSERT y DELETE ordinarias. 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 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.

ALTER TABLE SINTAXIS

Noé
fuente
7
Este método funcionó para mí, aunque para evitar situaciones en las que las columnas podrían estar en un orden diferente (es decir, desde un comando ADD COLUMN anterior), utilicé: UPDATE SQLITE_MASTER SET SQL = replace (SQL, '[MyColumn] integer NOT NULL' , '[MyColumn] integer NULL') DONDE NOMBRE = 'MyTable'. Además, tenga cuidado de no ejecutar esto como parte de una transacción, ya que puede evitar que se ejecuten algunos de los comandos de transacciones anteriores.
Ross
32

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. Pero puede modificar el tipo de datos de la columna de la tabla u otra propiedad mediante los siguientes pasos.

  1. COMENZAR LA TRANSACCIÓN;
  2. CREAR TABLA TEMPORAL t1_backup (a, b);
  3. INSERT INTO t1_backup SELECT a, b FROM t1;
  4. DROP TABLE t1;
  5. CREAR TABLA t1 (a, b);
  6. INSERT INTO t1 SELECT a, b FROM t1_backup;
  7. DROP TABLE t1_backup;
  8. COMETER

Para más detalles puede consultar el enlace .

Rajesh
fuente
Para cambiar el nombre de la tabla: ALTER TABLE table1 RENAME TO table2;
live-love
No olvide los índices. Ejecute .schema para generar una declaración de creación con índices.
live-love