2010-10-22 6 views
8

Je dois écrire une routine DROP COLUMN pour manipuler des bases de données SQLite.Routine SQLite drop column

Il serait appelé quelque chose comme ceci:

dropColumn("SomeTable", "SomeColumn"); 

Le SQLite FAQ dit que pour déposer une colonne, vous devez créer une table temporaire ne contenant que les colonnes que vous voulez, puis copier les données sur la et le renommer.

Il ne devrait pas être trop difficile d'encapsuler cela dans une routine. Mais il semble que ce serait ennuyeux de l'écrire.

Sûrement quelqu'un là-bas a déjà écrit une telle routine. Si oui, puis-je le voler s'il vous plaît? :)

+0

Il est essentiellement dépendante de ce que la plate-forme vous allez déployer sur SQLite. Sauf si vous voulez recompiler SQlite avec la routine à l'intérieur? – MPelletier

+0

@MPelletier, la plate-forme est .Net. Mais je pense que le code devrait facilement être portable sur n'importe quelle autre plateforme moderne. Cela devrait simplement impliquer l'exécution de SQL et la manipulation de chaînes. –

+0

dans ce cas, oui. Une chose à utiliser pour recréer facilement la table sans analyser l'original 'Create Table' est' PRAGMA table_info'. – MPelletier

Répondre

5

est ici un code pseudo pour vous:

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

Ne pas oublier les index et les déclencheurs sur la table! 'DROP TABLE' supprime également les index, les triggers et les clés étrangères. Vous pouvez utiliser 'SELECT * FROM sqlite_master WHERE type! = 'Table' ET tbl_name = 'MyTable')' pour obtenir les instructions CREATE pour eux. Bien sûr, si le déclencheur ou l'index utilise la clé supprimée, vous êtes en difficulté ... – Martijn

+0

@Martijn Merci pour les conseils. J'ai écrit cet exemple du haut de ma tête, donc ce n'est pas complet et n'était pas destiné à l'être. Espérons qu'il a compris le point cependant. – Sparafusile

+0

@Sparausile: mon commentaire n'était pas une critique autant que de fournir plus d'informations. Désolé si ce n'était pas clair. :-) – Martijn