Sí, puede, sin agregar una nueva columna. Usted tiene que tener cuidado de hacerlo correctamente para evitar la corrupción de la base de datos, por lo que debe volver completamente a su base de datos antes de intentar esto:
pragma writable_schema=1;
// replace the entire table's SQL definition, where new_sql_definition contains the foreign key clause you want to add
UPDATE SQLITE_MASTER SET SQL = new_sql_definition where name = 'child' and type = 'table';
// alternatively, you might find it easier to use replace, if you can match the exact end of the sql definition
// for example, if the last column was my_last_column integer not null:
UPDATE SQLITE_MASTER SET SQL = replace(sql, 'my_last_column integer not null', 'my_last_column integer not null, foreign key (col1, col2) references other_table(col1, col2)') where name = 'child' and type = 'table';
pragma writable_schema=0;
De cualquier manera, es probable que desee ver primero lo que el SQL definición es antes de hacer cualquier cambio:
select sql from SQLITE_MASTER where name = 'child' and type = 'table';
Si se utiliza el método replace(), puede que le resulte útil, antes de ejecutar, probar primero su comando replace() ejecutando:
select update(sql, ...) from SQLITE_MASTER where name = 'child' and type = 'table';
Creo que es más fácil cambiar el nombre de la tabla anterior, crear la nueva tabla y copiar los datos nuevamente. Luego puede soltar la tabla anterior. – tuinstoel
Sí, eso es más fácil. Solo estaba citando las preguntas frecuentes de sqlite: http://www.sqlite.org/faq.html#q11. De hecho, 'RENAME TO' es una de las pocas variantes' ALTER TABLE' que actualmente es compatible con sqlite 3. –
No debería ser: FOREIGN KEY (parent_id) REFERENCIAS parent (id) Es cierto que Jonathan no lo hizo dar el nombre de la "tabla padre". De hecho, la tabla debe ser nombrada persona, pero ... – igorludi