2010-01-18 207 views
34

Soy bastante nuevo en SQLite 3 y ahora tenía que agregar una columna a una tabla existente que tenía. Fui a hacer eso haciendo: ALTER TABLE thetable ADD COLUMN category;.Modificar el tipo de una columna en sqlite3

Por supuesto, olvidé especificar el tipo de columna. Lo primero que pensé hacer fue dejar caer esa columna y luego volver a agregarla. Sin embargo, parece que SQLite no tiene una forma simple de hacer esto, y yo tendría que hacer una copia de seguridad de la tabla y volver a crearla sin la columna.

Esto parece complicado, y me preguntaba si había alguna forma de modificar/agregar el tipo de una columna. Me lo imaginaba, pero mi búsqueda no arrojó ningún resultado, siendo nuevo en SQLite, imagino que fue debido a que mi redacción no estaba en la consulta.

Respuesta

40

SQLite no admite la eliminación o modificación de columnas, apparently. Pero recuerde que los tipos de datos de columna aren't rigid en SQLite, tampoco.

Consulte también:

+0

Entonces, si no definiera un tipo, ¿aún así podría insertar texto en él? Por supuesto, más tarde cuando despliegue a producción, declararé explícitamente el tipo (texto), pero por ahora debería estar bien. –

+2

Sí. También puede insertar valores que no sean de texto en esa columna: "SQLite usa un sistema de tipo dinámico más general. En SQLite, el tipo de datos de un valor está asociado con el valor en sí, no con su contenedor". (desde mi segundo enlace) Especificar los tipos de columnas tiene mucha menos importancia en SQLite que otros RDBM. –

+2

Esto es cierto ... pero si luego crea otras tablas con el tipo de datos que habría utilizado, entonces sus consultas de combinación no podrán usar índices porque las columnas no tendrán el mismo tipo – DallinDyer

2

Es posible que la recreación de table.Its trabajan para mí por favor, siga paso siguiente:

  1. crear tabla temporal utilizando como SELECT * FROM su tabla
  2. suelte su tabla, cree su tabla usando la columna de modificar tipo
  3. ahora insertar registros de tabla temporal a la tabla recién creada
  4. gota tabla temporal

hacer todos los pasos anteriores en el subproceso de trabajo para reducir la carga en 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

Si prefiere una interfaz gráfica de usuario , DB Browser for SQLite lo hará con unos pocos clics.

  1. "Archivo" - "Abrir base de datos"
  2. En la ficha "Estructura de base de datos", haga clic en el contenido de la tabla (no nombre de la tabla), entonces el menú "Editar", "Modificar tabla", y ahora puede cambiar el tipo de datos de cualquier columna con un menú desplegable. Cambié un campo de 'texto' a 'numérico' para recuperar datos en un rango numérico.

DB Browser para SQLite es de código abierto y gratuito. Para Linux está disponible desde el repositorio.

+0

¿Qué quiere decir con "* haga clic en el contenido de la tabla (no en el nombre de la tabla) *"? En la pestaña "Estructura de la base de datos", tuve que hacer clic en el nombre de la tabla en Tablas -> Mi tabla. También pude hacer clic derecho en el nombre de la tabla para abrir un menú emergente, donde puede elegir "Modificar tabla". – stackoverflowuser2010

Cuestiones relacionadas