Garantiza la coherencia entre tus tablas con REFERENCES y elige de forma deliberada el comportamiento de ON DELETE.
Abrir esta lección en KodokonUna clave foránea declara que una columna apunta a la clave primaria de otra tabla. La base de datos rechaza entonces cualquier valor huérfano: no puedes crear un libro cuyo autor no existe. Cuidado, en SQLite esta comprobación está desactivada por defecto: actívala con un PRAGMA al principio de tu script.
PRAGMA foreign_keys = ON;
CREATE TABLE authors (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE books (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
author_id INTEGER NOT NULL
REFERENCES authors(id)
ON DELETE CASCADE
);
INSERT INTO authors (id, name) VALUES
(1, 'Ursula K. Le Guin'),
(2, 'Ted Chiang');
INSERT INTO books (id, title, author_id) VALUES
(1, 'A Wizard of Earthsea', 1),
(2, 'The Dispossessed', 1),
(3, 'Exhalation', 2);Prueba la protección: inserta un libro huérfano y luego elimina un autor. La primera instrucción se rechaza; la segunda se lleva sus libros consigo gracias a ON DELETE CASCADE.
INSERT INTO books (id, title, author_id)
VALUES (4, 'Orphan', 99);
DELETE FROM authors WHERE id = 1;
SELECT id, title FROM books;ON DELETE define el destino de las filas hijas cuando el padre desaparece. CASCADE las elimina junto con él. SET NULL conserva la fila pero borra la referencia - por lo que la columna debe aceptar NULL. Sin ninguna cláusula, SQLite aplica NO ACTION: eliminar el padre se rechaza mientras queden hijos, un comportamiento cercano a RESTRICT.
CREATE TABLE articles (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
reviewer_id INTEGER
REFERENCES authors(id)
ON DELETE SET NULL
);