Claves primarias y foráneas
Las claves primarias (Primary Keys, PK) y las claves foráneas (Foreign Keys, FK) son la base para establecer relaciones entre tablas en una base de datos relacional.
Clave primaria (PK)
Una clave primaria identifica de manera única cada fila en una tabla. Debe cumplir con las siguientes características:
- Unicidad: No puede haber dos filas con el mismo valor en la clave primaria.
- No nulo: No puede contener valores nulos.
- Inmutable: Idealmente, el valor de la clave primaria no debe cambiar.
- Simplicidad: Debe ser lo más simple posible, preferiblemente un solo atributo.
En general, se recomienda crear un campo
IDcomo clave primaria, que sea un número entero autoincremental. Esto facilita la gestión de las filas y asegura unicidad sin tener que complicar la clave primaria con múltiples atributos.
Clave foránea (FK)
Una clave foránea es un campo (o conjunto de campos) en una tabla que hace referencia a la clave primaria de otra tabla. Las claves foráneas se utilizan para establecer y reforzar la integridad referencial entre las tablas.
Si no haces uso de claves foráneas, podrías tener datos huérfanos o inconsistentes en tu base de datos, por ejemplo:
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE messages (
id INTEGER PRIMARY KEY,
user_id INTEGER,
message TEXT NOT NULL
);
INSERT INTO users (id, name) VALUES (1, 'user0');
INSERT INTO messages (id, user_id, message) VALUES (1, 999, 'Hello world!');
El usuario con
id = 999no existe en la tablausers, pero el mensaje se ha insertado igualmente, lo que genera inconsistencia en los datos.
Definir claves primarias y foráneas
Para definir una clave primaria al crear una tabla, se utiliza la palabra clave PRIMARY KEY. Para definir una clave foránea, se utiliza la palabra clave FOREIGN KEY junto con REFERENCES para indicar a qué tabla y columna hace referencia.
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS messages;
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE messages (
id INTEGER PRIMARY KEY,
user_id INTEGER,
message TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);
INSERT INTO users(id, name) VALUES
(1,'user1'),
(2,'user2'),
(3,'user3');
Luego, al realizar un INSERT en la tabla messages, SQLite verificará que el valor de user_id exista en la tabla users, asegurando la integridad referencial.