2010-04-21 43 views
38

Necesito modificar una columna en una base de datos SQLite pero tengo que hacerlo programáticamente debido a que la base de datos ya está en producción. De mi investigación, he descubierto que para hacer esto debo hacer lo siguiente.SQLite Modificar columna

  • crear una nueva tabla con el nuevo esquema
  • Copiar datos de la tabla antigua a la nueva mesa
  • gota mesa de edad
  • Cambiar el nombre de la nueva tabla para tablas antiguo nombre

Eso parece una ridícula cantidad de trabajo por algo que debería ser relativamente fácil. ¿No hay una manera más fácil? Todo lo que necesito hacer es cambiar una restricción en una columna existente y darle un valor predeterminado.

+0

Posible duplicado de [modificar tipo de una columna en sqlite3] (http://stackoverflow.com/questions/2083543/modify-a-columns -type-in-sqlite3) – rubo77

+0

Creé un script para cambiar el nombre de un campo en una tabla aquí. http://stackoverflow.com/a/41577393/1069083 – rubo77

Respuesta

39

Ese es uno de los inconvenientes más conocidos de SQLite (sin MODIFY COLUMN apoyo en ALTER TABLE), pero es en el list of SQL features that SQLite does not implement.

edición: Se ha eliminado bits que se menciona que puede ser apoyado en una versión futura que la página se actualiza para indicar que ya no es el caso

7

Como dijo here, este tipo de características no están implementadas por SQLite.

Como nota al margen, usted podría hacer sus dos primeros pasos con una mesa de crear con selecto:

CREATE TABLE tmp_table AS SELECT id, name FROM src_table 
+3

Buen truco, esto me evita preguntar "¿Cómo puedo cambiar el orden de los campos en una tabla?". – SIFE

+0

El único caso en el que funciona la nota lateral (gracias a @SIFE) es una columna de reordenamiento. Para cualquier cambio de definición de columna, aún necesita 2 pasos: CREAR, INSERTAR. ref: https://www.sqlite.org/lang_createtable.html – epox

1

Cuando me encontré con "CREATE tabla llamada tmp_table TABLA AS SELECT id, nombre src_table" , Perdí todo el formato del tipo de columna (por ejemplo, campo de tiempo convertido en un campo entero

Como dije inicialmente parece que debería ser más fácil, pero esto es lo que hice para arreglar. Tenía este problema b/c que quería para cambiar el campo No Nulo en una columna y Sqlite no ayuda realmente allí.

Usando el 'Administrador SQLite' Navegador de Firefox (usa lo que quieras). Creé la nueva tabla copiando la antigua declaración de creación, hice mi modificación y la ejecuté. Luego, para copiar los datos, simplemente resalté las filas, hago clic R en "Copiar fila (s) como SQL", reemplazo "someTable" con mi nombre de tabla y ejecuto el SQL.

19

Si la modificación no es demasiado grande (por ejemplo, cambiar la longitud de un varchar), se puede volcar el PP, editar manualmente la definición de base de datos y la importación de nuevo:

echo '.dump' | sqlite3 test.db > test.dump 

continuación, abra el archivo con un editor de texto, la búsqueda de la definición que desea modificar y, a continuación:

cat test.dump | sqlite3 new-test.db 
+0

En my 3BG homeserver.db con muchas tablas grandes, esto demora 100 horas en eliminar el shema.¿No hay alguna manera de simplemente volcar esa única tabla de mi base de datos, eliminarla dentro de la base de datos y luego insertar la tabla modificada nuevamente? – rubo77

Cuestiones relacionadas