Alterar el tipo de columna SQLite y agregar restricción PK

¿Cómo cambiar el tipo de una columna en una tabla de SQLite?

Tengo:

CREATE TABLE table( id INTEGER, salt TEXT NOT NULL UNIQUE, step INT, insert_date TIMESTAMP ); 

Me gustaría cambiar el tipo de salt a TEXT y el tipo de ID para INTEGER PRIMARY KEY.

A continuación se muestra un extracto del manual de SQLite sobre el command ALTER TABLE (ver URL: SQLite Alter Table ):

SQLite admite un subset limitado de ALTER TABLE. El command ALTER TABLE en SQLite le permite al usuario cambiar el nombre de una tabla o agregar una nueva columna a una tabla existente. No es posible cambiar el nombre de una columna, eliminar una columna o agregar o quitar restricciones de una tabla.

Como se indica en el manual, no es posible modificar el tipo o las restricciones de una columna, como convertir NULL a NOT NULL. Sin embargo, hay un trabajo alnetworkingedor

  1. copyndo la tabla anterior en una tabla temporal,
  2. creando una nueva tabla definida como deseada, y
  3. copyndo los datos de la tabla temporal a la nueva tabla.

Para dar crédito donde se debe crédito, lo aprendí de la discusión sobre el Issue # 1 del proyecto django-email-usernames de hakanw en bitbucket.org.

 CREATE TABLE test_table( id INTEGER, salt TEXT NOT NULL UNIQUE, step INT, insert_date TIMESTAMP ); ALTER TABLE test_table RENAME TO test_table_temp; CREATE TABLE test_table( id INTEGER PRIMARY KEY, salt TEXT, step INT, insert_date TIMESTAMP ); INSERT INTO test_table SELECT * FROM test_table_temp; DROP TABLE test_table_temp; 

Notas

  1. Utilicé el nombre de tabla test_table ya que SQLite generará un error si intenta nombrar una tabla como table .
  2. El command INSERT INTO fallará si sus datos no se ajustan a las nuevas restricciones de la tabla. Por ejemplo, si la test_table original contiene dos campos de id con el mismo número integer, recibirá un " SQL error: PRIMARY KEY must be unique " cuando ejecute el INSERT INTO test_table SELECT * FROM test_table_temp; " INSERT INTO test_table SELECT * FROM test_table_temp; ".
  3. Para todas las testings, utilicé SQLite versión 3.4.0 como parte de Python 2.6.2 ejecutándose en mi MacBook Unibody de 13 "con Mac OS X 10.5.7.

Como RDBMS no está especificado, estas son consultas de DB2:

  1. Hacer ID como key principal:

     ALTER TABLE table ADD CONSTRAINT pk_id PRIMARY KEY (id) 
  2. Haz que la sal no sea ÚNICA:

     ALTER TABLE table DROP UNIQUE <salt-unique-constraint-name> 
  3. Hacer sal nulo:

     ALTER TABLE table ALTER COLUMN salt DROP NOT NULL 

Tendrá que hacer una reorganización después de la caída no nula. Esto se debe hacer desde el símbolo del sistema.

 reorg table <tableName> 

En este caso, puede convertir la sal en anulable y eliminar la restricción única. Además, si la columna id no contiene ningún valor nulo o duplicado, puede convertirlo en key principal de manera segura utilizando el estudio de administración del server sql. a continuación está la captura de pantalla. espero que lo haga más claro: text alternativo http://img265.imageshack.us/img265/7418/91573473.png

o use el siguiente sql:

 alter table <TableName> modify salt text null alter table <TableName> drop constraint <Unique Constraint Name> alter table <TableName> modify id int not null alter table <TableName> add constraint pk<Table>d primary key (id)