una not eliminar drop como columna column sqlite

eliminar - sqlite alter table add column if not exists



Insertar nueva columna en la tabla en sqlite? (6)

Tengo una tabla con name columnas, qty , rate . Ahora necesito agregar una nueva columna COLNew entre las columnas name y qty . ¿Cómo agrego una nueva columna entre dos columnas?


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ándose de que las instrucciones INSERT incluyan nombres de columnas. Lo hago utilizando DB Browser for SQLite, que tiene una característica útil para eso. Después de eso, solo tiene que editar la declaración de creación de la tabla e insertar la nueva columna donde lo desee y volver a crear la db.

En * nix como sistemas es solo algo en la línea de

cat db.sql | sqlite3 database.db

No sé cuán factible es esto con bases de datos muy grandes, pero funcionó en mi caso.


No agrega columnas entre otras columnas en SQL, simplemente las agrega. El lugar donde se colocan 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 los quiere en el orden {name,colnew,qty,rate} , use:

select name, colnew, qty, rate from ...

Con SQLite, necesita usar sqlite.org/lang_altertable.html , un ejemplo es:

alter table mytable add column colnew char(50)


Puede agregar 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 un soporte limitado de ALTER TABLE 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, tendrá que volver a crear la tabla. Puede guardar los datos existentes en una tabla temporal, eliminar la tabla anterior, crear la tabla nueva 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:

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 sus nuevos datos así:

UPDATE t1 SET b=''blah'' WHERE a=''key''


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 crea la nueva tabla con la columna que falta:

CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);

Y rellénalo con los datos antiguos:

INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;

Luego borra la tabla antigua:

DROP TABLE TempOldTable;

Prefiero la segunda opción, ya que le permitirá cambiar el nombre de todo si es necesario.


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, ingresando un valor predeterminado según sea necesario. Como en su caso, debe llamar a la consulta SELECT y obtendrá el orden de las columnas, como ya dijo paxdiablo :

SELECT name, colnew, qty, rate FROM{tablename}

y en mi opinión, el nombre de su 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á ningún problema.

Esta es la forma segura en el sentido de que, de lo contrario, si está utilizando CREATE temptable o RENAME table o CREATE , existe una alta posibilidad de pérdida de datos si no se maneja con cuidado, por ejemplo, en el caso de que ocurran transacciones mientras la batería está acabarse.