2010-01-18 11 views
34

Sono abbastanza nuovo in SQLite 3 e solo ora ho dovuto aggiungere una colonna a un tavolo esistente che avevo. Ho fatto questo facendo: ALTER TABLE thetable ADD COLUMN category;.Modifica un tipo di colonna in sqlite3

Ovviamente, ho dimenticato di specificare il tipo di colonna. La prima cosa che stavo pensando di fare è stata far cadere quella colonna e poi riaggiungerla. Tuttavia, sembra che SQLite non abbia un modo semplice per farlo, e avrei dovuto fare il backup della tabella e ricrearla senza la colonna.

Questo sembra complicato, e mi chiedevo se ci fosse solo un modo di modificare/aggiungere il tipo di una colonna. Immagino di sì, ma la mia ricerca in giro non ha dato risultati, essendo nuova per SQLite, immagino che fosse dovuto al fatto che la mia formulazione non era nella query.

risposta

40

SQLite non supporta la rimozione o la modifica di colonne, apparently. Ma ricordate che i tipi di dati delle colonne aren't rigid in SQLite, entrambi.

Consulta anche:

+0

Quindi, se non avessi definito un tipo, avrei comunque potuto inserire del testo? Ovviamente più tardi, quando distribuirò in produzione, specificherò esplicitamente il tipo (testo), ma per ora dovrei andare bene? –

+2

Sì. È possibile inserire valori non di testo anche in quella colonna: "SQLite utilizza un sistema di tipo dinamico più generale: in SQLite, il tipo di dati di un valore è associato al valore stesso, non al suo contenitore". (dal mio secondo link) Specificare i tipi di colonne ha molto meno importanza in SQLite rispetto ad altri RDBM. –

+2

Questo è vero ... ma se successivamente crei altre tabelle con il tipo di dati che avresti usato, allora le tue query di join non saranno in grado di utilizzare gli indici perché le colonne non avranno lo stesso tipo – DallinDyer

2

E 'possibile ricreando table.Its lavorano per me si prega di seguire passo successivo:

  1. creare tabella temporanea utilizzando come select * from il tuo tavolo
  2. rilascia il tuo tavolo, crea la tua tabella usando il tipo di colonna di modifica
  3. ora inserire i record dalla tabella temporanea al vostro tavolo appena creata
  4. goccia tabella temporanea

fare tutti i passaggi di cui sopra in thread di lavoro per ridurre il carico sulla uithread

0
#!/bin/bash 

DB=/tmp/synapse/homeserver.db 
TABLE="public_room_list_stream" 
FIELD=visibility 
OLD="BOOLEAN NOT NULL" 
NEW="INTEGER NOT NULL" 
TMP=/tmp/sqlite_$TABLE.sql 

echo "### create dump" 
echo ".dump '$TABLE'" | sqlite3 "$DB" >$TMP 

echo "### editing the create statement" 
sed -i "s|$FIELD $OLD|$FIELD $NEW|g" $TMP 

read -rsp $'Press any key to continue deleting and recreating the table $TABLE ...\n' -n1 key 

echo "### rename the original to '$TABLE"_backup"'" 
sqlite3 "$DB" "PRAGMA busy_timeout=20000; ALTER TABLE '$TABLE' RENAME TO '$TABLE"_backup"'" 

echo "### delete the old indexes" 
for idx in $(echo "SELECT name FROM sqlite_master WHERE type == 'index' AND tbl_name LIKE '$TABLE""%';" | sqlite3 $DB); do 
    echo "DROP INDEX '$idx';" | sqlite3 $DB 
done 

echo "### reinserting the edited table" 
cat $TMP | sqlite3 $DB 
4

Se preferite una GUI , DB Browser for SQLite lo farà con pochi clic.

  1. "File" - "Apri database"
  2. Nella scheda "struttura del database", fare clic sul contenuto della tabella (non il nome della tabella), poi menu "Modifica", "Modifica tabella", e ora si puoi cambiare il tipo di dati di qualsiasi colonna con un menu a discesa. Ho modificato un campo "testo" in "numerico" per recuperare i dati in un intervallo numerico.

DB Browser per SQLite è open source e gratuito. Per Linux è disponibile dal repository.

+0

Cosa intendi con "* fai clic sul contenuto della tabella (non sul nome della tabella) *"? Nella scheda "Struttura del database", dovevo fare clic sul nome della tabella sotto Tabelle -> Mytable. Ho anche potuto fare clic con il tasto destro del mouse sul nome della tabella per aprire un menu popup, in cui puoi scegliere "Modifica tabella". – stackoverflowuser2010

Problemi correlati