SQLite: claves foráneas

Los datos expuestos en este blog, son solo de índole informativo. Por favor realiza siempre una copia de seguridad antes de realizar cualquier cambio en tu proyecto.

SQLite: claves foráneas

Este tutorial de SQLite explica cómo usar clave externa En SQLite, con sintaxis y ejemplos.

¿Qué son las claves foráneas en SQLite?

Las claves foráneas son un método para hacer cumplir la integridad referencial en las bases de datos SQLite. Una clave externa significa que un valor en una tabla también debe aparecer en la otra tabla.

La tabla a la que se hace referencia se denomina tabla principal y la tabla con la clave externa se denomina tabla secundaria. La clave externa en la tabla secundaria generalmente se refiere a la clave principal en la tabla principal.

Las claves foráneas solo se pueden definir en la sentencia CREATE TABLE.

propina: No puede usar ALTER TABLE para agregar claves foráneas a una tabla porque SQLite no admite agregar restricciones en una instrucción ALTER TABLE. Sin embargo, le mostraremos una solución alternativa más adelante en este tutorial que le permite agregar claves externas a las tablas existentes.

Cómo crear claves foráneas usando la instrucción CREATE TABLE

sintaxis

La sintaxis para crear claves foráneas en SQLite usando la declaración CREATE TABLE es:

CREATE TABLE table_name
(
  column1 datatype [ NULL | NOT NULL ],
  column2 datatype [ NULL | NOT NULL ],
  ...

  CONSTRAINT fk_column
    FOREIGN KEY (column1, column2, ... column_n)
    REFERENCES parent_table (column1, column2, ... column_n)
);

ejemplo

Veamos un ejemplo de cómo crear claves foráneas usando la instrucción CREATE TABLE en SQLite.

Por ejemplo:

CREATE TABLE departments
( department_id INTEGER PRIMARY KEY AUTOINCREMENT,
  department_name VARCHAR
);

CREATE TABLE employees
( employee_id INTEGER PRIMARY KEY AUTOINCREMENT,
  last_name VARCHAR NOT NULL,
  first_name VARCHAR,
  department_id INTEGER,
  CONSTRAINT fk_departments
    FOREIGN KEY (department_id)
    REFERENCES departments(department_id)
);

En este ejemplo, hemos creado una clave principal en la tabla de departamentos que contiene solo un campo: el campo id_departamento. Luego creamos una clave externa en la tabla de empleados llamada fk_departments que hace referencia a la tabla de departamentos según el campo de departamento_id.

Cómo agregar una clave externa a una tabla existente

No puede agregar claves externas en SQLite usando la instrucción ALTER TABLE. En su lugar, debe cambiar el nombre de la tabla, crear una nueva tabla con la clave externa y copiar los datos en la nueva tabla.

sintaxis

La sintaxis para agregar una clave externa a una tabla existente en SQLite es:

PRAGMA foreign_keys=off;

BEGIN TRANSACTION;

ALTER TABLE table1 RENAME TO _table1_old;

CREATE TABLE table1
(
  column1 datatype [ NULL | NOT NULL ],
  column2 datatype [ NULL | NOT NULL ],
  ...

  CONSTRAINT fk_column
    FOREIGN KEY (column1, column2, ... column_n)
    REFERENCES parent_table (column1, column2, ... column_n)
);

INSERT INTO table1 SELECT * FROM _table1_old;

COMMIT;

PRAGMA foreign_keys=on;

ejemplo

Primero, comencemos creando 2 tablas (departamentos y empleados):

CREATE TABLE departments
( department_id INTEGER PRIMARY KEY AUTOINCREMENT,
  department_name VARCHAR
);

CREATE TABLE employees
( employee_id INTEGER PRIMARY KEY AUTOINCREMENT,
  last_name VARCHAR NOT NULL,
  first_name VARCHAR,
  department_id INTEGER
);

A continuación, agreguemos algunos datos a estas tablas:

INSERT INTO departments VALUES (30, 'HR');
INSERT INTO departments VALUES (999, 'Sales');

INSERT INTO employees VALUES (10000, 'Smith', 'John', 30);
INSERT INTO employees VALUES (10001, 'Anderson', 'Dave', 999);

Ahora, agreguemos una clave externa a la tabla de empleados:

PRAGMA foreign_keys=off;

BEGIN TRANSACTION;

ALTER TABLE employees RENAME TO _employees_old;

CREATE TABLE employees
( employee_id INTEGER PRIMARY KEY AUTOINCREMENT,
  last_name VARCHAR NOT NULL,
  first_name VARCHAR,
  department_id INTEGER,
  CONSTRAINT fk_departments
    FOREIGN KEY (department_id)
    REFERENCES departments(department_id)
);

INSERT INTO employees SELECT * FROM _employees_old;

COMMIT;

PRAGMA foreign_keys=on;

Este ejemplo cambia el nombre de nuestra tabla de empleados existente a _employees_old. Luego creará una nueva tabla de empleados con una clave externa llamada fk_departments que hace referencia a la tabla de departamentos según el campo de ID del departamento. Luego inserta todos los datos de la tabla _employees_old en la tabla de empleados.

Esta solución le permite agregar una clave externa a la tabla de empleados sin perder datos en la tabla.