2010-10-22 15 views
8

Ho bisogno di scrivere una routine DROP COLUMN per manipolare i database SQLite.SQLite drop column routine

Si sarebbe chiamato qualcosa di simile:

dropColumn("SomeTable", "SomeColumn"); 

Lo SQLite FAQ dice che per eliminare una colonna, è necessario creare una tabella temporanea che contiene solo le colonne che si desidera, e quindi copiare i dati attraverso di e poi rinominarlo.

Non dovrebbe essere troppo difficile racchiuderlo in una routine. Ma sembra che sarebbe un po 'fastidioso scriverlo.

Sicuramente qualcuno là fuori ha già scritto una tale routine. Se sì, posso rubarlo per favore? :)

+0

E 'fondamentalmente dipende da quale piattaforma verrà distribuito SQLite. A meno che non vogliate ricompilare SQlite con la routine all'interno? – MPelletier

+0

@MPelletier, la piattaforma è .Net. Ma immagino che il codice dovrebbe facilmente essere trasferito su qualsiasi altra piattaforma moderna. Dovrebbe solo coinvolgere l'esecuzione di alcuni SQL e fare alcune manipolazioni delle stringhe. –

+0

in tal caso, sì. Una cosa da usare per ricreare facilmente la tabella senza analizzare l'originale 'Create Table' è' PRAGMA table_info'. – MPelletier

risposta

5

Ecco alcuni pseudo codice per voi:

columnNameList = "" 
newTableStr = "CREATE TABLE tempMyTable (" 
execute statement: "PRAGMA table_info('MyTable')" 
While looping through RecordSet 
    If RecordSet.name != tableRowToDeleteName 
    If columnNameList != "" Then columnNameList += "," 
    columnNameList += RecordSet.name 

    newTableStr += RecordSet.name + " " + RecordSet.type 
    If RecordSet.notnull Then 
     newTableStr += " NOT NULL" 
    End If 
    If RecordSet.dflt_value != "" Then 
     newTableStr += " DEFAULT(" + RecordSet.dflt_value + ")" 
    End If 
    If Not Last Record in RecordSet 
     newTableStr += "," 
    End If 
    End If 
End Loop 
newTableStr += ");" 

execute statement: newTableStr 
execute statement: "INSERT INTO tempMyTable (" + columnNameList + ")" + 
        "SELECT " + columnNameList + " FROM MyTable;" 

Delete table: MyTable 
Rename Table: tempMyTable to MyTable 
+1

Non dimenticare gli indici e i trigger sul tavolo! 'DROP TABLE' rilascia anche gli indici di partecipazione, i trigger e le chiavi esterne. Puoi usare 'SELECT * FROM sqlite_master WHERE type! = 'Table' AND tbl_name = 'MyTable')' per ottenere le istruzioni CREATE per loro. Ovviamente, se il trigger o l'indice utilizza la chiave cancellata, sei nei guai ... – Martijn

+0

@Martijn Grazie per i suggerimenti. Ho scritto questo esempio in cima alla mia testa, quindi non è completo né era previsto. Spero comunque che abbia raggiunto il punto. – Sparafusile

+0

@Sparausile: il mio commento non è stato inteso come critica tanto quanto fornire maggiori informazioni. Scusa se non era chiaro. :-) – Martijn