constraint column after sqlite sqlite3

constraint - alter table add column after sqlite



ALTER COLUMN en sqlite (3)

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

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

Creo que no hay ALTER COLUMN en sqlite, solo ALTER TABLE es compatible.

¿Alguna idea? ¡Gracias!


No hay ALTER COLUMN en sqlite.

Creo que tu única opción es:

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

Esta otra respuesta de explica el proceso en detalle


SQLite admite 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. COMIENZA LA TRANSACCIÓN;
  2. CREATE TEMPORARY TABLE t1_backup (a, b);
  3. INSERT INTO t1_backup SELECT a, b FROM t1;
  4. DROP TABLE t1;
  5. CREAR LA 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 http://www.sqlite.org/lang_altertable.html .


Si bien es cierto que no hay 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;

Tendrá que cerrar y volver a abrir su conexión o pasar la base de datos al vacío 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**

REFERENCIAS SIGUEN:

pragma writable_schema
Cuando este pragma está activado, las tablas SQLITE_MASTER en las que se puede cambiar la base de datos utilizando 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.

[alter table] (De http://www.sqlite.org/lang_altertable.html )
SQLite admite 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.