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.

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


