Agregue el comportamiento ON DELETE CASCADE a una tabla sqlite3 después de haber sido creado

¿Es posible agregar ON DELETE CASCADE a una tabla después de que se haya creado?

Mi esquema es el siguiente:

CREATE TABLE skills(name varchar, skill varchar, level int, foreign key(name) references runners(name), primary key(name, skill));

Y me gustaría conectar en cascada si se elimina la clave externa.

El comando ALTER TABLE SQLite no puede hacer lo que quieras.

Sin embargo, es posible eludir el intérprete de SQL y cambiar la definición de la tabla interna directamente. SQLite almacena definiciones de tablas como una copia textual del comando CREATE TABLE en su tabla sqlite_master ; mira el resultado de esta consulta:

 SELECT sql FROM sqlite_master WHERE type='table' AND name='skills'; 

Agregue la especificación de su cascada a esa cadena, luego habilite el acceso de escritura a sqlite_master con PRAGMA writable_schema=1; y escriba su nueva definición de tabla en él:

 UPDATE sqlite_master SET sql='...' WHERE type='table' AND name='skills'; 

Luego vuelve a abrir la base de datos.

ADVERTENCIA : Esto funciona solo para cambios que no cambian el formato en disco de la tabla. Si realiza algún cambio que cambie el formato de registro (como agregar / eliminar campos o modificar rowid ), su base de datos explotará de forma horrible.