Tengo una tabla con columnas name
, qty
, rate
. Ahora necesito agregar una nueva columna COLNew
entre las columnas name
y qty
. ¿Cómo agrego una nueva columna entre dos columnas?
354
Tienes dos opciones. Primero, simplemente puede agregar una nueva columna con lo siguiente:
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
En segundo lugar, y más complicado, pero en realidad pondría la columna donde lo desea, sería cambiar el nombre de la tabla:
ALTER TABLE {tableName} RENAME TO TempOldTable;
Luego cree la nueva tabla con la columna que falta:
CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);
Y llenarlo con los datos antiguos:
INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;
Luego elimine la tabla anterior:
DROP TABLE TempOldTable;
Preferiría mucho la segunda opción, ya que te permitirá cambiar el nombre de todo por completo si es necesario.
PRAGMA foreign_keys = ON;
(consulte sqlite.org/foreignkeys.html#fk_enable )No agrega columnas entre otras columnas en SQL, solo las agrega. Donde se colocan depende totalmente del DBMS. El lugar correcto para asegurarse de que las columnas salgan en el orden correcto es cuando las coloque
select
.En otras palabras, si los quiere en el orden
{name,colnew,qty,rate}
, use:Con SQLite, debe usar
alter table
, un ejemplo es:fuente
SELECT * FROM mytable
?select *
. A veces es útil para programas que desean hacer un descubrimiento de tablas pero, para la gran mayoría de los usos, debe especificar explícitamente lo que desea y, por lo tanto, el orden en que lo desea.Puedes agregar una nueva columna con la consulta
Pero se agregará al final, no entre las columnas existentes.
fuente
SQLite tiene un soporte ALTER TABLE limitado que puede usar para agregar una columna al final de una tabla o para cambiar el nombre de una tabla.
Si desea realizar cambios más complejos en la estructura de una tabla, deberá volver a crear la tabla. Puede guardar los datos existentes en una tabla temporal, descartar la tabla anterior, crear la nueva tabla y luego volver a copiar los datos de la tabla temporal.
Por ejemplo, suponga que tiene una tabla llamada "t1" con los nombres de las columnas "a" y "c" y que desea insertar la columna "b" de esta tabla. Los siguientes pasos ilustran cómo se podría hacer esto:
Ahora está listo para insertar sus nuevos datos de esta manera:
fuente
INSERT INTO t1 SELECT a,c FROM t1_backup;
causa el error: "la tabla t1 tiene 3 columnas pero se proporcionaron 2 valores: INSERTAR EN t1 SELECCIONE a, c DESDE t1_backup;". La línea correcta debería serINSERT INTO t1 (a,c) SELECT a,c FROM t1_backup;
Esta actualización es necesaria para manejar el valor nulo, ingresando un valor predeterminado según lo requiera. Como en su caso, debe llamar a la
SELECT
consulta y obtendrá el orden de las columnas, como ya dijo paxdiablo :y en mi opinión, el nombre de su columna para obtener el valor del cursor:
así que si el índice cambia, su aplicación no enfrentará ningún problema.
Esta es la forma segura en el sentido de que, de lo contrario, si está utilizando
CREATE temptable
oRENAME table
oCREATE
, habría una alta probabilidad de pérdida de datos si no se maneja con cuidado, por ejemplo, en el caso de que sus transacciones ocurran mientras la batería se está agotando.fuente
Estaba enfrentando el mismo problema y el segundo método propuesto en la respuesta aceptada, como se señaló en los comentarios, puede ser problemático cuando se trata de claves externas.
Mi solución es exportar la base de datos a un archivo sql asegurándome de que las instrucciones INSERT incluyan nombres de columna. Lo hago usando DB Browser para SQLite que tiene una característica útil para eso. Después de eso, solo tiene que editar la instrucción de creación de tabla e insertar la nueva columna donde lo desee y volver a crear la base de datos.
En * nix like systems es solo algo en la línea de
No sé qué tan factible es esto con bases de datos muy grandes, pero funcionó en mi caso.
fuente