Se è vero che il non è ALTER COLUMN, se desideri solo rinominare la colonna, eliminare il vincolo NOT NULL, o modificare il tipo di dati, è possibile utilizzare la seguente serie di comandi pericolosi:
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;
Sarà necessario chiudere e riaprire la connessione o passare l'aspirapolvere nel database per ricaricare le modifiche nello schema.
Ad esempio:
Y:>sqlite3 booktest
versione di SQLite 3.7.4
Enter ".help" per le istruzioni
immettere istruzioni SQL terminato con un ";"
sqlite>creare tabella BOOKS (titolo TEXT NOT NULL, publication_date TEXT NOT NULL);
sqlite>inserire in BOOKS VALUES ("NULLTEST", null);
Errore: BOOKS.publication_date potrebbe non essere NULL
sqlite>PRAGMA writable_schema = 1;
sqlite>UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS (titolo TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
sqlite>PRAGMA writable_schema = 0;
sqlite>.Q
Y:>sqlite3 booktest
versione di SQLite 3.7.4
Enter".aiuto" per le istruzioni
Inserisci istruzioni SQL terminato con un ";"
sqlite>inserto in libri VALORI ("NULLTEST", null);
SQLite>.Q
riferimenti seguono:
pragma writable_schema
Quando questo pragma è acceso, i tavoli sqlite_master in cui i dati base può essere modificata utilizzando le istruzioni ordinarie UPDATE, INSERT e DELETE. Attenzione: l'uso improprio di questo pragma può facilmente risultare in un file di database corrotto.
[alter table] (Da http://www.sqlite.org/lang_altertable.html)
SQLite supporta un sottoinsieme limitato di ALTER TABLE. Il comando ALTER TABLE in SQLite consente all'utente di rinominare una tabella o aggiungere una nuova colonna a una tabella esistente. Non è possibile rinominare una colonna, rimuovere una colonna o aggiungere o rimuovere i vincoli da una tabella.
Questo metodo ha funzionato per me, anche se per evitare situazioni in cui le colonne potrebbero essere in un ordine diverso (cioè da un precedente comando ADD COLUMN), ho usato: UPDATE SQLITE_MASTER SET SQL = replace (SQL, '[MyColumn] intero NOT NULL', '[MyColumn] intero NULL') WHERE NAME = 'MyTable'. Inoltre, fai attenzione a non eseguirlo come parte di una transazione: potrebbe impedire l'esecuzione di alcuni dei precedenti comandi di transazione. – Ross