2010-10-22 20 views
8

Necesito escribir una rutina DROP COLUMN para manipular bases de datos SQLite.rutina SQLite drop column

Se llamaría algo así:

dropColumn("SomeTable", "SomeColumn"); 

El SQLite FAQ dice que quitar una columna, usted tiene que crear una tabla temporal que contiene sólo las columnas que desea, y luego copiar los datos a través de y luego cambiarle el nombre.

No debería ser demasiado difícil encapsular eso en una rutina. Pero parece que sería un poco molesto escribirlo.

Seguramente alguien ya haya escrito una de esas rutinas. Si es así, ¿puedo robarlo, por favor? :)

+0

es básicamente dependiente de la plataforma que va a implementar SQLite. ¿A menos que quiera recomponer SQlite con la rutina interna? – MPelletier

+0

@MPelletier, la plataforma es .Net. Pero creo que el código debería poder transportarse fácilmente a cualquier otra plataforma moderna. Simplemente debería implicar la ejecución de algunos SQL y hacer algo de manipulación de cadenas. –

+0

en ese caso, sí. Una cosa para usar para recrear fácilmente la tabla sin analizar el 'Create Table' original es' PRAGMA table_info'. – MPelletier

Respuesta

5

He aquí algunos pseudo-código para usted:

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

¡No olvide los índices y disparadores en la tabla! 'DROP TABLE' también quita los índices asistentes, disparadores y claves foráneas. Puede usar 'SELECT * FROM sqlite_master WHERE type! = 'Table' Y tbl_name = 'MyTable')' para obtener las instrucciones CREATE para ellos. Por supuesto, si el desencadenante o índice utiliza la clave eliminada, tiene problemas ... – Martijn

+0

@Martijn Gracias por los consejos. Escribí este ejemplo en la parte superior de mi cabeza, por lo que no está completo ni pretendía serlo. Sin embargo, afortunadamente entendió el punto. – Sparafusile

+0

@Sparausile: mi comentario no fue tan criticado como proporcionar más información. Lo siento si eso no estaba claro. :-) – Martijn