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?¿Insertar una nueva columna en la tabla en sqlite?
Respuesta
Tiene dos opciones. En primer lugar, sólo se ha podido añadir una nueva columna con la siguiente:
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
En segundo lugar, y más complicada, pero en realidad poner la columna donde desee, sería la de cambiar el nombre de la tabla:
ALTER TABLE {tableName} RENAME TO TempOldTable;
a continuación, cree la nueva tabla con la columna que falta:
CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);
y rellenarla con los datos antiguos:
INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;
continuación, elimine la tabla antigua:
DROP TABLE TempOldTable;
Yo más prefieren la segunda opción, ya que le permitirá cambiar el nombre completo todo si es necesario.
No agrega columnas entre otras columnas en SQL, solo tiene que agregarlas. Donde están puestos depende totalmente del DBMS. El lugar correcto para asegurarse de que las columnas salgan en el orden correcto es cuando las select
.
En otras palabras, si usted los quiere en la orden {name,colnew,qty,rate}
, que utilice:
select name, colnew, qty, rate from ...
Con SQLite, es necesario utilizar alter table
, siendo un ejemplo:
alter table mytable add column colnew char(50)
'SELECT * FROM mytable'? – EML
¿Cuál es el valor predeterminado establecido si no lo especificamos en las filas existentes de la nueva columna? – Jacob
Hay muy pocos casos de uso donde debería estar haciendo 'select *' en absoluto. A veces es útil para los programas que desean hacer el 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. – paxdiablo
Puedes añadir nueva columna con la consulta
ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)
Pero se agregará al final, no entre las columnas existentes.
SQLite tiene una compatibilidad ALTER TABLE limitada 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, soltar la tabla anterior, crear la nueva tabla y luego copiar los datos de la tabla temporal.
Por ejemplo, supongamos que tiene una tabla llamada "t1" con los nombres de columnas "a" y "c" y que quiere insertar la columna "b" en esta tabla.Los pasos siguientes ilustran cómo esto se podría hacer:
BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,c);
INSERT INTO t1_backup SELECT a,c FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b, c);
INSERT INTO t1 SELECT a,c FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;
Ahora ya está listo para insertar los nuevos datos de este modo:
UPDATE t1 SET b='blah' WHERE a='key'
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};
Esta actualización es necesaria para manejar el valor nulo, insertando un valor predeterminado según lo requiera. Como en su caso, es necesario llamar a la consulta SELECT
y obtendrá el orden de las columnas, como paxdiablo ya se ha dicho:
SELECT name, colnew, qty, rate FROM{tablename}
y en mi opinión, el nombre de la columna para obtener el valor del cursor:
private static final String ColNew="ColNew";
String val=cursor.getString(cursor.getColumnIndex(ColNew));
así que si el índice cambia su aplicación no tendrá problemas.
Esta es la manera segura en el sentido de que en caso contrario, si está utilizando CREATE temptable
o RENAME table
o CREATE
, no 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 se realizan mientras el la batería se está agotando
Gracias @naval me funciona – Seetha
Tenía el mismo problema y el segundo método propuesto en la respuesta aceptada, como se señala en los comentarios, puede ser problemático cuando se trata de claves externas.
Mi solución alternativa es exportar la base de datos a un archivo sql asegurándose de que las instrucciones INSERT incluyen nombres de columna. Lo hago usando DB Browser for SQLite que tiene una característica útil para eso. Después de eso, solo tiene que editar la instrucción create table e insertar la nueva columna donde la desee y recrear el db.
En * nix como sistemas es sólo algo en la línea de
cat db.sql | sqlite3 database.db
no sé qué tan factible es con bases de datos muy grandes, pero funcionó en mi caso.
- 1. Insertar en crear nueva tabla
- 2. Insertar nulo en la tabla Sqlite
- 3. ¿Cómo agregar una nueva columna en una vista en sqlite?
- 4. Python y SQLite: insertar en la tabla
- 5. En sqlite Cómo agregar una columna en la tabla si la misma columna no existe en la tabla
- 6. Insertar filas en una tabla con una columna IDENTITY solamente
- 7. inserción en la tabla SQLite con la columna única
- 8. En Oracle, ¿es posible "insertar" una columna en una tabla?
- 9. Insertar en una columna seleccionando otra columna en otra tabla pero cómo llenar la segunda columna
- 10. Agregue una nueva columna en una gran tabla mysql
- 11. pitón + SQLite, insertar datos de las variables en la tabla
- 12. ¿Cómo agregar una nueva columna en una tabla después de la 2ª o 3ª columna en la tabla usando postgres?
- 13. ¿Cómo elimino la columna de la tabla sqlite en android?
- 14. Cómo insertar una columna en otra columna dentro de la misma tabla en SQL Server
- 15. Encuentra nombres de columna en la tabla SQLite vacío
- 16. sqlite insertar nuevo valor en la vista
- 17. SQLite Modificar columna
- 18. sqlite: cómo rellenar una nueva columna con valores una vez que se ha agregado una nueva columna?
- 19. ¿Insertar valores múltiples en una columna mysql?
- 20. MySQL Insertar registros desde varias tablas a la nueva tabla
- 21. Ordenar una tabla SQLite completa
- 22. En SQLite, ¿cómo copio los datos de una columna a otra en la misma tabla?
- 23. android insertar nueva línea en una notificación
- 24. Insertar un registro en una tabla con una columna declarada con la función SERIAL
- 25. Insertar .csvs en una base de datos SQLite en Java
- 26. Crear un activador que inserta valores en una nueva tabla cuando se actualiza una columna
- 27. Mysql - insertar en la tabla, con sólo un auto incrementando la columna
- 28. En la base de datos Sqlite, Cómo insertar varias filas en la tabla al mismo tiempo
- 29. Cómo crear una nueva columna en una consulta de selección
- 30. Cómo puedo insertar un objeto json en una tabla sqlite en javascript, phonegap (cordova)
Me gustaría ir por la primera opción, y usar la opción predeterminada de la opción secend ALTER TABLE {tableName} ADD COLUMN COLNew {type} DEFAULT {defaultValue}; Más importante: (pensando en por qué querrías pedir las columnas ...) usa siempre en cada acción de registro (como insertar o agregar) siempre los nombres de las columnas, de esta forma nunca más cometerás errores en tu código después de alterar la tabla. –
Dicho sea de paso: el valor predeterminado no se puede agregar en ALTER TABLE para algunos tipos de campo: http://www.sqlite.org/lang_altertable.html –
no se olvide de volver a crear los índices –