Buenas!!
SQLite si tiene integridad referencial, para manejar las
Foreign Key (FK) tienes que tener varias cosas en cuenta:
- Por compatibilidad con versiones anteriores están desactivadas por defecto, como bien dice Angelnu. Hay que activarlas por conexión con el PRAGMA.
- A la hora de crear una FK en la base de datos puedes:
- Controlar el "cuando", clasificarlas como inmediatas o diferidas, por defecto son inmediatas a no ser que uses DEFERRABLE al crearlas. Afecta al momento en que funcionan, las inmediatas en cuanto haces un INSERT fallan, las diferidas te dejan hacer INSERT pero cuando haces COMMIT dan error si no hay integridad referencial, dejando la transacción sin completar.
- Controlar el "cómo", darles un comportamiento en el borrado (ON DELETE) o en la actualización (ON UPDATE). Y tienes también varias opciones:
- NO ACTION: pues eso, que no haga nada, es la opción por defecto.
- RESTRICT: ni actualizas ni borras en la tabla padre si hay registros dependientes.
- SET NULL: el campo FK en la tabla hija se pone a NULL si borras o modificas la tabla padre.
- SET DEFAULT: igual que el anterior pero en vez de NULL usa el valor DEFAULT del campo.
- CASCADE: Actualiza o borra todos los registros de la tabla hija.
- Tipos de tablas referenciadas, no es lo mismo tener una FK a una tabla auxiliar que a una tabla normal. Por ejemplo, si tengo una tabla de prendas de ropa con una FK a una tabla de colores, no poner un CASCADE, borras el rojo y borras todos los artículos de ese color. Mejor un SET DEFAULT o SET NULL. Si tienes una tabla de facturas y una con las lineas de detalle de las facturas (o pedidos, albaranes, ....), pones un CASCADE, al borrar la factura borras sus lineas de detalle.
Hay más matices, para más información:
SQLite Foreign Keys
Un saludo.