2009-06-09 8 views
13

¿Cómo cambiar el tipo de una columna en una tabla SQLite?Alteración del tipo de columna SQLite y adición de la restricción PK

Tengo:

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

me gustaría cambiar el tipo de salt 's simplemente TEXT y tipo de ID de número entero de clave principal.

+0

¿Necesita más información incluyendo otros índices, constrains, PKs ... Si usa MSSQL, haga "Script table as ..." -> "Create to" -> "New Query window", y pegue ese script aquí también. Entonces alguien lo ayudará a crear secuencias de comandos ALTER para el cambio. – van

Respuesta

0

En este caso se puede hacer sal-anulable y quitar restricción única. Además, si id columna no contiene ningún valor nulo o duplicado, puede convertirlo en clave principal de manera segura utilizando el estudio de administración de servidor sql. a continuación está la captura de pantalla. espero que hace que sea más claro: alt text http://img265.imageshack.us/img265/7418/91573473.png

o uso SQL siguiente:

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

Sí, pero creo que él quiere saber CÓMO. :) –

+3

esta pregunta es sobre sqlite, no sobre el servidor SQL, la sintaxis 'alterar tabla' anterior no es compatible con SQLite, desafortunadamente. – Abel

1

Desde RDBMS no se especifica, se trata de consultas de DB2: Identificación

  1. tomamos como clave principal:

    ALTER TABLE table 
        ADD CONSTRAINT pk_id 
        PRIMARY KEY (id)
  2. Hacer sal como no ÚNICO:

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

    ALTER TABLE table 
        ALTER COLUMN salt DROP NOT NULL

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

reorg table <tableName> 
+2

Mi la respuesta se publicó antes de que la pregunta se editara para especificar la base de datos utilizada. –

27

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

SQLite soporta un subconjunto limitado de ALTER TABLE. El comando ALTER TABLE en SQLite 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 eliminar restricciones de una tabla .

Como indica 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 alrededor de

  1. copiar la tabla de edad a una tabla temporal,
  2. crear una nueva tabla definida como se desee, y
  3. copiar 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. he usado el nombre de la tabla test_table desde SQLite generará un error si se intenta nombrar una tabla como table.
  2. El comando INSERT INTO fallará si sus datos no se ajustan a las nuevas restricciones de la tabla. Por ejemplo, si el test_table original contiene dos campos id con el mismo número entero, recibirá un "SQL error: PRIMARY KEY must be unique" cuando ejecute el comando "INSERT INTO test_table SELECT * FROM test_table_temp;".
  3. Para todas las pruebas, que utiliza SQLite versión 3.4.0 como se incluye como parte de Python 2.6.2 corriendo en mi 13" Unibody MacBook con Mac OS X 10.5.7.
+2

¿Qué sucede si hay un índice que hace referencia a la tabla descartada? Tiene que ser recreado, ¿verdad? – mafu

Cuestiones relacionadas