Clave primaria y clave externa en SQLite con ejemplos

โšก Resumen inteligente

Claves primarias y claves forรกneas en SQLite Garantizar la integridad de los datos mediante la identificaciรณn รบnica de cada fila y la vinculaciรณn de las tablas relacionadas, asegurando que los valores referenciados siempre existan y evitando registros duplicados, nulos o huรฉrfanos en una base de datos relacional.

  • ๐Ÿ”‘ Clave primaria: Una clave primaria identifica de forma รบnica cada fila, y sus valores deben ser รบnicos y nunca nulos.
  • ๐Ÿงฉ Clave compuesta: La combinaciรณn de dos o mรกs columnas forma una clave primaria compuesta cuando ninguna columna individual es รบnica.
  • ๐Ÿ”— Clave externa: Una clave externa hace referencia a la clave de una tabla principal y garantiza la integridad referencial entre tablas relacionadas.
  • โš™๏ธ Habilitar la aplicaciรณn de la normativa: SQLite Deshabilita las claves forรกneas por defecto, asรญ que ejecute PRAGMA foreign_keys = ON para activarlas.
  • ๐Ÿงฑ Restricciones de columna: Las reglas NOT NULL, DEFAULT, UNIQUE y CHECK validan los valores antes de que se introduzcan en una columna.
  • ๐Ÿค– Asistencia de IA: Los asistentes de IA para convertir texto a SQL y GitHub Copilot generan claves y restricciones SQL a partir de texto en inglรฉs sencillo.

Clave primaria y clave externa en SQLite

Las secciones siguientes explican SQLite Restricciones en detalle, comenzando con la CLAVE PRIMARIA y la CLAVE FORรNEA que definen y conectan las tablas, y abarcando las reglas NOT NULL, DEFAULT, UNIQUE y CHECK que validan los datos en cada columna.

SQLite Limitaciones

Las restricciones de columna imponen reglas a los valores insertados en una columna para validar los datos. Estas restricciones se definen al crear una tabla, dentro de la definiciรณn de la columna. Mantienen la coherencia y precisiรณn de los datos almacenados al rechazar los valores que infringen las reglas establecidas, como duplicados, valores nulos o valores que no existen en una tabla relacionada.

SQLite Clave primaria

Todos los valores de una columna de clave primaria deben ser รบnicos y no nulos. La clave primaria identifica de forma รบnica cada fila de la tabla.

La clave primaria puede aplicarse a una sola columna o a una combinaciรณn de columnas. En este รบltimo caso, la combinaciรณn de los valores de las columnas debe ser รบnica para todas las filas de la tabla.

Sintaxis:

Existen varias formas diferentes de definir una clave primaria en una tabla:

En la propia definiciรณn de la columna:

ColumnName INTEGER NOT NULL PRIMARY KEY;

Como definiciรณn separada:

PRIMARY KEY(ColumnName);

Para crear una combinaciรณn de columnas como clave principal:

PRIMARY KEY(ColumnName1, ColumnName2);

SQLite Restricciones NOT NULL, DEFAULT, UNIQUE y CHECK

Ademรกs de la clave primaria, SQLite Proporciona varias restricciones de columna que validan los valores introducidos en una tabla. Las restricciones NOT NULL, DEFAULT, UNIQUE y CHECK se definen en la definiciรณn de la columna, y cada una de ellas impone una regla especรญfica sobre la columna. tipo de datos y valores.

Restricciรณn NOT NULL

El SQLite La restricciรณn NOT NULL impide que una columna tenga un valor nulo:

ColumnName INTEGER  NOT NULL;

Restricciรณn POR DEFECTO

Con la funciรณn SQLite Restricciรณn DEFAULT: si no se inserta ningรบn valor en una columna, se inserta el valor predeterminado.

Por ejemplo:

ColumnName INTEGER DEFAULT 0;

Si escribes una instrucciรณn INSERT y no especificas ningรบn valor para esa columna, la columna tendrรก el valor 0.

Restricciรณn รšNICA

El SQLite La restricciรณn UNIQUE impide que existan valores duplicados entre todos los valores de la columna.

Por ejemplo:

EmployeeId INTEGER NOT NULL UNIQUE;

Esto garantiza que el valor de โ€œEmployeeIdโ€ sea รบnico; no se permiten valores duplicados. Tenga en cuenta que esto se aplica รบnicamente a los valores de la columna โ€œEmployeeIdโ€.

VERIFICAR restricciรณn

El SQLite La restricciรณn CHECK establece una condiciรณn para verificar un valor insertado. Si el valor no cumple la condiciรณn, no se insertarรก.

Quantity INTEGER NOT NULL CHECK(Quantity > 10);

No se puede introducir un valor inferior a 10 en la columna "Cantidad".

SQLite Clave externa

El SQLite Una clave forรกnea es una restricciรณn que verifica la existencia de un valor presente en una tabla en otra tabla que tiene una relaciรณn con la primera tabla donde se define la clave forรกnea.

Al trabajar con varias tablas, a veces dos tablas se relacionan entre sรญ mediante una columna en comรบn. Si desea garantizar que el valor insertado en una de ellas exista en la columna de la otra tabla, debe utilizar una restricciรณn de clave externa en la columna comรบn.

En este caso, cuando intente insertar un valor en esa columna, la clave externa garantizarรก que el valor insertado exista en la columna de la tabla a la que se hace referencia.

Tenga en cuenta que las restricciones de clave externa no estรกn habilitadas de forma predeterminada en SQLitePrimero debes habilitarlos ejecutando el siguiente comando:

PRAGMA foreign_keys = ON;

Se introdujeron restricciones de clave externa en SQLite a partir de la versiรณn 3.6.19.

Ejemplo de SQLite Clave externa

Supongamos que tenemos dos tablas: Estudiantes y Departamentos.

La tabla Estudiantes contiene una lista de estudiantes, y la tabla Departamentos contiene una lista de departamentos. Cada estudiante pertenece a un departamento; es decir, cada estudiante tiene una columna departmentId.

Ahora veremos cรณmo la restricciรณn de clave externa puede ser รบtil para garantizar que el valor del ID del departamento en la tabla Estudiantes debe existir en la tabla Departamentos.

Por lo tanto, si creamos una restricciรณn de clave externa en el DepartmentId de la tabla Students, cada departmentId insertado debe estar presente en la tabla Departments.

CREATE TABLE [Departments] (
	[DepartmentId] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
	[DepartmentName] NVARCHAR(50)  NULL
);
CREATE TABLE [Students] (
	[StudentId] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
	[StudentName] NVARCHAR(50)  NULL,
	[DepartmentId] INTEGER  NOT NULL,
	[DateOfBirth] DATE  NULL,
	FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId)
);

Para comprobar cรณmo las restricciones de clave externa pueden impedir que se inserte un elemento o valor no definido en una tabla que tiene una relaciรณn con otra tabla, analizaremos el siguiente ejemplo.

En este ejemplo, la tabla Departamentos tiene una relaciรณn de clave externa con la tabla Estudiantes, por lo que cualquier valor de departmentId insertado en la tabla Estudiantes debe existir en la tabla Departamentos. Si intenta insertar un valor de departmentId que no existe en la tabla Departamentos, la restricciรณn de clave externa lo impedirรก.

Insertemos dos departamentos, โ€œTIโ€ y โ€œArtesโ€, en la tabla Departamentos con lo siguiente: Consultas INSERT:

INSERT INTO Departments VALUES(1, 'IT');
INSERT INTO Departments VALUES(2, 'Arts');

Las dos sentencias deberรญan insertar dos departamentos en la tabla Departments. Puede confirmar que los dos valores se insertaron ejecutando la consulta โ€œSELECT * FROM Departmentsโ€ posteriormente:

Resultado de la consulta SELECT que muestra los departamentos de TI y Artes en SQLite

A continuaciรณn, intente insertar un nuevo estudiante con un departmentId que no exista en la tabla Departments:

INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);

La fila no se insertarรก y recibirรก un error que dice: Fallรณ la restricciรณn de CLAVE FORรNEA.

SQLite Mensaje de error: Fallรณ la restricciรณn de clave externa

Diferencia entre clave primaria y clave forรกnea en SQLite

Las claves primarias y las claves forรกneas contribuyen a mantener la integridad de los datos, pero desempeรฑan funciones diferentes. Una clave primaria identifica las filas dentro de una misma tabla, mientras que una clave forรกnea vincula filas entre dos tablas relacionadas. La siguiente tabla resume las principales diferencias.

Base Clave primaria Clave externa
Propรณsito Identifica de forma รบnica cada fila en su propia tabla. Se refiere a la clave primaria de otra tabla para vincularlas.
Exclusividad Los valores deben ser รบnicos Los valores pueden repetirse, por lo que muchas filas secundarias pueden compartir un elemento padre.
Valores nulos No puede ser nulo Puede ser nulo cuando la relaciรณn es opcional.
Nรบmero por mesa Solo una clave primaria por tabla. Una tabla puede tener varias claves forรกneas.
Indexaciรณn Indexado automรกticamente No se indexa automรกticamente; agregue uno para mejorar el rendimiento.

En el ejemplo de Estudiantes y Departamentos, DepartmentId es la clave primaria de la tabla Departamentos y una clave forรกnea en la tabla Estudiantes, que es lo que vincula a cada estudiante con un departamento vรกlido.

SQLite Clave primaria compuesta

Una clave primaria compuesta es una clave primaria formada por dos o mรกs columnas. Se utiliza cuando ninguna columna es รบnica por sรญ sola, pero la combinaciรณn de columnas es รบnica para cada fila. SQLite trata los valores combinados como una sola clave.

Por ejemplo, una tabla de matriculaciรณn puede permitir que un mismo estudiante estรฉ inscrito en muchos cursos y que varios estudiantes estรฉn inscritos en el mismo curso, pero cada par estudiante-curso debe aparecer solo una vez:

CREATE TABLE Enrollments (
	StudentId INTEGER NOT NULL,
	CourseId INTEGER NOT NULL,
	Grade TEXT,
	PRIMARY KEY (StudentId, CourseId)
);

Aquรญ, ni StudentId ni CourseId son รบnicos por sรญ solos, pero el par (StudentId, CourseId) sรญ lo es, por lo que un mismo estudiante no puede estar matriculado en el mismo curso dos veces. Tenga en cuenta los siguientes puntos al usar una clave compuesta:

  • Utilice una clave compuesta cuando una sola columna no pueda identificar de forma unรญvoca una fila.
  • Cada columna de la clave compuesta sigue las reglas de la clave primaria, por lo que el valor combinado debe ser รบnico y no nulo.
  • Una clave compuesta se escribe como una clรกusula PRIMARY KEY independiente a nivel de tabla, no dentro de la definiciรณn de una sola columna.

SQLite Acciones de clave externa: ON DELETE y ON UPDATE

Una clave externa tambiรฉn puede controlar quรฉ sucede con las filas secundarias cuando se elimina o actualiza la fila principal a la que hacen referencia. Estas acciones referenciales se agregan con las clรกusulas ON DELETE y ON UPDATE al definir la clave externa. SQLite apoya cinco acciones:

  • SIN ACCIร“N โ€” la acciรณn predeterminada, que genera un error si las filas secundarias aรบn hacen referencia a la fila principal.
  • RESTRINGIR โ€” impide eliminar o actualizar inmediatamente, antes de que se ejecute cualquier otro cambio.
  • ESTABLECER NULO โ€” establece la columna de clave externa secundaria en nulo.
  • ESTABLECER PREDETERMINADO โ€” establece la columna de clave externa secundaria a su valor predeterminado declarado.
  • CASCADE โ€” aplica el mismo cambio a las filas secundarias, por lo que al eliminar un elemento principal se eliminan tambiรฉn sus elementos secundarios.

El siguiente ejemplo recrea la tabla de Estudiantes de manera que al eliminar un departamento se eliminen automรกticamente sus estudiantes, y al actualizar el ID de un departamento se actualicen los estudiantes correspondientes:

CREATE TABLE Students (
	StudentId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
	StudentName NVARCHAR(50) NULL,
	DepartmentId INTEGER NOT NULL,
	FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId)
		ON DELETE CASCADE
		ON UPDATE CASCADE
);

Recuerde que las acciones referenciales solo se ejecutan cuando la compatibilidad con claves forรกneas estรก activada, por lo que debe ejecutar PRAGMA foreign_keys = ON al inicio de cada conexiรณn. Sin ella, SQLite Analiza las clรกusulas ON DELETE y ON UPDATE, pero no las aplica.

Preguntas Frecuentes

Sรญ. Cuando una sola columna se declara exactamente como INTEGER PRIMARY KEY, se convierte en un alias para el rowid integrado de la tabla. SQLite No mantiene un รญndice separado para ello, por lo que las bรบsquedas mediante esa clave son rรกpidas y no utilizan almacenamiento adicional.

La aplicaciรณn de claves forรกneas permanece desactivada por defecto para preservar la compatibilidad con versiones anteriores de bases de datos y scripts escritos antes de la versiรณn 3.6.19. Cada conexiรณn a la base de datos debe ejecutar PRAGMA foreign_keys = ON antes SQLite comienza a comprobar las restricciones de clave externa.

SQLite Indexa automรกticamente las claves primarias y las columnas UNIQUE, pero no las columnas de clave externa. Dado que la columna secundaria se lee en cada comprobaciรณn de restricciรณn, se recomienda crear un รญndice propio para cada columna de clave externa para optimizar el rendimiento.

No. ALTER TABLE en SQLite No se puede agregar una clave primaria o una clave forรกnea a una tabla existente. Debe renombrar la tabla antigua, crear una nueva tabla con la clave definida, copiar las filas con INSERT SELECT y, finalmente, eliminar la tabla antigua.

Una clave primaria de tipo entero simple asigna el siguiente ID como uno por encima del ID de fila existente mรกs grande y puede reutilizar los ID despuรฉs de las eliminaciones. AUTOINCREMENTO tracks es el ID mรกs alto jamรกs utilizado en sqlite_sequence y nunca reutiliza un valor, con un pequeรฑo coste de rendimiento.

Este error aparece al insertar o actualizar una fila secundaria cuyo valor de clave externa no tiene una fila coincidente en la tabla principal, o al eliminar una fila principal que aรบn tiene filas secundarias. Inserte primero el registro principal.

Sรญ. Los asistentes de IA para convertir texto a SQL transforman una descripciรณn en lenguaje natural de tus tablas en sentencias CREATE TABLE con clรกusulas PRIMARY KEY y FOREIGN KEY. Proporcionar el esquema existente mejora la precisiรณn, y el SQL generado siempre debe revisarse antes de ejecutarse con datos reales.

Sรญ. Copiloto de GitHub sugiere cรณdigo CREATE TABLE con PRIMARY KEY, FOREIGN KEY y otras restricciones en lรญnea en editores como VS CodeLee tu esquema y migraciones existentes, por lo que sus sugerencias reutilizan los nombres reales de tus tablas y columnas.

Resumir este post con: