2010-10-24 17 views
55

Come si modifica la colonna in sqlite? Questo è in PostgresqlALTER COLUMN in sqlite

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL; 

credo che ci sia alcuna colonna ALTER in SQLite a tutti, solo ALTER TABLE è supportato.

Qualche idea? Grazie!

risposta

84

Non c'è ALTER COLUMN in sqlite.

credo che l'unica opzione è quella di:

  • rinominare la tabella a un nome temporaneo
  • creare una nuova tabella, senza il vincolo NOT NULL
  • Copiare il contenuto della vecchia tabella per il nuovo uno
  • Rimuovere la vecchia tabella

This other Stackoverflow answer spiega il processo in dettaglio

56

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.

ALTER TABLE SYNTAX

+4

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

28

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. Ma è possibile modificare il tipo di dati della colonna della tabella o altre proprietà tramite i seguenti passaggi.

  1. BEGIN TRANSACTION;
  2. CREA TABELLA TEMPORANEA t1_backup (a, b);
  3. INSERISCI IN t1_backup SELECT a, b FROM t1;
  4. DROP TABLE t1;
  5. CREATE TABLE t1 (a, b);
  6. INSERISCI INTO t1 SELEZIONA a, b FROM t1_backup;
  7. DROP TABLE t1_backup;
  8. COMMIT

Per maggiori dettagli è possibile consultare la link.

+0

Per rinominare la tabella: ALTER TABLE table1 RENAME TO table2; –

+0

Non dimenticare gli indici. Esegui .schema per generare istruzioni create con indici. –

4

Nessuna delle altre risposte è errata ma ho trovato che il modo più semplice per gestire ALTER complicati è tramite Sqliteman (FOSS).

Gestirà l'atto di giocoleria (come descritto in altre risposte) per voi.

Select tavolo books_book, attraverso il menu: Contesto> Alter Table: Un-check NULL> Alter, fatto

Vedere Sqliteman Doc: Alter Table