Kodokon kodokon.com

Claves foráneas e integridad referencial

Garantiza la coherencia entre tus tablas con REFERENCES y elige de forma deliberada el comportamiento de ON DELETE.

8 min · 3 preguntas

Abrir esta lección en Kodokon

Una 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.

SQL
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);
REFERENCES vincula books.author_id con authors.id.

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.

SQL
INSERT INTO books (id, title, author_id)
VALUES (4, 'Orphan', 99);

DELETE FROM authors WHERE id = 1;

SELECT id, title FROM books;
La inserción falla; después del DELETE, solo queda Exhalation.

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.

SQL
CREATE TABLE articles (
  id INTEGER PRIMARY KEY,
  title TEXT NOT NULL,
  reviewer_id INTEGER
    REFERENCES authors(id)
    ON DELETE SET NULL
);
Vínculo opcional: si el revisor se va, el artículo sobrevive.

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. Con ON DELETE CASCADE en books.author_id, ¿qué provoca DELETE FROM authors WHERE id = 1?
    • Un error mientras el autor tenga libros
    • La eliminación del autor y de todos sus libros
    • Poner author_id en NULL en sus libros
  2. ¿Por qué ejecutar PRAGMA foreign_keys = ON; en SQLite?
    • Para crear las claves foráneas
    • Porque la comprobación de claves foráneas está desactivada por defecto, conexión por conexión
    • Para acelerar las uniones
  3. ¿Qué condición debe cumplir la columna reviewer_id para usar ON DELETE SET NULL?
    • Estar declarada como UNIQUE
    • Ser de tipo INTEGER
    • Aceptar NULL, es decir, no llevar NOT NULL