Clave primaria y clave externa en SQLite con ejemplos

Restricciones de SQLite

Las restricciones de columna imponen restricciones y reglas a los valores insertados en una columna para validar los datos insertados. Las restricciones de las columnas se definen al crear una tabla, en la definición de la columna.

Clave primaria de SQLite

Todos los valores de una columna de clave principal deben ser únicos y no nulos.

La clave principal se puede aplicar a una sola columna o a una combinación de columnas; en el último caso, la combinación de los valores de las columnas debe ser única para todas las filas de las tablas.

Sintaxis:

Hay muchas formas diferentes de definir una clave principal en una tabla como:

  • 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);

Restricción no nula

La restricción SQLite Not null evita que una columna tenga un valor nulo:

ColumnName INTEGER  NOT NULL;

Restricción POR DEFECTO

Restricción predeterminada de SQLite: si no inserta ningún valor en una columna, se insertará el valor predeterminado.

Por Ejemplo:

ColumnName INTEGER DEFAULT 0;

Si escribe una instrucción de inserción y no especificó ningún valor para esa columna, la columna tendrá el valor 0.

Restricción ÚNICA de SQLite

Restricción única de SQLite que evitará valores duplicados entre todos los valores de la columna.

Por ejemplo:

EmployeeId INTEGER NOT NULL UNIQUE;

Esto hará cumplir la "ID de empleado" valor sea único, no se permitirán valores duplicados. Tenga en cuenta que esto se aplica a los valores de la columna. "ID de empleado" solamente.

Restricción de verificación de SQLite

SQLite verifica una condición para verificar un valor insertado; si el valor no coincide con la condición, no se insertará.

Quantity INTEGER NOT NULL CHECK(Quantity > 10);

No puede insertar un valor inferior a 10 en el "Cantidad" columna.

Clave foránea de SQLite

La clave externa de SQLite es una restricción que verifica la existencia de un valor presente en una tabla para otra tabla que tiene una relación con la primera tabla donde se define la clave externa.

Al trabajar con varias tablas, cuando hay dos tablas que se relacionan entre sí con una columna en común. Y si desea asegurarse de que el valor insertado en uno de ellos debe existir en la columna de la otra tabla, entonces debe usar una "Restricción de clave externa" en la columna en común.

En este caso, cuando intenta insertar un valor en esa columna, la clave externa garantizará que el valor insertado exista en la columna de la tabla.

Tenga en cuenta que las restricciones de claves externas no están habilitadas de forma predeterminada en SQLite, primero debes habilitarlos ejecutando lo siguientewing mando:

PRAGMA foreign_keys = ON;

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

Ejemplo de clave externa SQLite

Supongamos que tenemos dos tablas; Estudiantes y Departamentos.

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

Ahora, veremos cómo puede ser útil la restricción de clave externa para garantizar que el valor de la identificación del departamento en la tabla de estudiantes deba existir en la tabla de departamentos.

Clave foránea de SQLite

Entonces, si creamos una restricción de clave externa en el Id. de departamento en la tabla Estudiantes, cada Id. de departamento insertado debe estar presente en la tabla Departamentos.

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 evitar que se inserte un elemento o valor indefinido en una tabla que tiene una relación con otra tabla, veremos lo siguientewing ejemplo.

En este ejemplo, la tabla Departamentos tiene una restricción de clave externa para la tabla Estudiantes, por lo que cualquier valor de ID de departamento insertado en la tabla de estudiantes debe existir en la tabla de departamentos. Si intenta insertar un valor de ID de departamento que no existe en la tabla de departamentos, la restricción de clave externa le impedirá hacerlo.

Insertemos dos departamentos. "ESO" y "Letras" en la tabla de departamentos de la siguiente manerawing:

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

Las dos declaraciones deben insertar dos departamentos en la tabla de departamentos; puede asegurarse de que los dos valores se insertaron ejecutando la consulta “SELECCIONAR * DE Departamentos” después:

Clave foránea de SQLite

Luego intente insertar un nuevo estudiante con un ID de departamento que no existe en la tabla de departamentos:

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

La fila no se insertará y recibirá un error que indicará lo siguiente: Error en la restricción de CLAVE EXTRANJERA.