2010-11-23 21 views

Respuesta

533

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.

+14

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. –

+2

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 –

+4

no se olvide de volver a crear los índices –

78

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) 
+2

'SELECT * FROM mytable'? – EML

+0

¿Cuál es el valor predeterminado establecido si no lo especificamos en las filas existentes de la nueva columna? – Jacob

+7

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

6

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.

8

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' 
4
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

+0

Gracias @naval me funciona – Seetha

0

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.

Cuestiones relacionadas