El término integridad de datos se refiere a la corrección y complementación de los datos en una base de datos.
Cuando los contenidos se modifican con sentencias INSERT
, DELETE
o UPDATE
, la integridad de los datos almacenados puede perderse de muchas maneras diferentes, p.e :
Una de las funciones importantes de un DBMS relacional es preservar la integridad de sus datos almacenados en la mayor medida posible.
NULL
. Se define efectuando la declaración de una columna es NOT NULL
cuando la tabla que contiene las columnas se crea por primera vez, como parte de la sentencia CREATE TABLE
.CREATE TABLE
. El DBMS comprueba automáticamente la unicidad del valor de la clave primaria con cada sentencia INSERT
Y UPDATE
. Un intento de insertar o actualizar una fila con un valor de la clave primaria ya existente fallará.UPDATE
y la misma no coincide con ninguna llave primaria.MySQL soporta cinco tipos de tablas: MyISAM
, ISAM
, HEAP
, BDB
(Base de datos Berkeley), e InnoDB
. BDB
e InnoDB
son ambas tipos de tablas transaccionales. Además de poder trabajar con transacciones en MySQL
, las tablas del tipo InnoDB también tienen soporte para la definición de claves foráneas, por lo que se nos permite definir reglas o restricciones que garanticen la integridad referencial de los registros.
A partir de la versión 4.0, MySQL ha agregado InnoDB a la lista de tipos de tablas soportados en una instalación típica.
Nota: para asegurarnos que tenemos soporte para el tipo de tablas InnoDB podemos ejecutar la siguiente sentencia:
mysql> SHOW VARIABLES LIKE '%innodb%'
Si el resultado no es vacio entonces tenemos soporte para innoDB.
InnoDB no crea de manera automática índices en las claves foráneas o en las claves referenciadas, así que debemos crearlos de manera explícita. Los índices son necesarios para que la verificación de las claves foráneas sea más rápida.
A continuación se muestra como definir las dos tablas de ejemplo con una clave foránea.
CREATE TABLE cliente
(
id_cliente INT NOT NULL,
nombre VARCHAR(30),
PRIMARY KEY (id_cliente)
) ENGINE = INNODB;
CREATE TABLE venta
(
id_factura INT NOT NULL,
id_cliente INT NOT NULL,
cantidad INT,
PRIMARY KEY(id_factura),
INDEX (id_cliente),
FOREIGN KEY (id_cliente) REFERENCES cliente(id_cliente)
) ENGINE = INNODB;
-- Base de datos: `padres_hijos`
--
-- Estructura de tabla para la tabla `padres`
CREATE TABLE `padres` (
`padre_ID` int(11) NOT NULL auto_increment,
`padreNombre` varchar(25) NOT NULL,
PRIMARY KEY (`padre_ID`)
) ENGINE=InnoDB ;
-- Estructura de tabla para la tabla `hijos`
CREATE TABLE `hijos` (
`hijo_ID` int(11) NOT NULL auto_increment,
`hijoNombre` varchar(25) NOT NULL,
`hijoPadre_ID` int(11) NOT NULL,
PRIMARY KEY (`hijo_ID`),
KEY `hijoPadre_ID` (`hijoPadre_ID`)
) ENGINE=InnoDB ;
-- Agregando referencia a posterior en la tabla `hijos`
--
ALTER TABLE `hijos`
ADD CONSTRAINT `relacion_padre_hijos`
FOREIGN KEY (`hijoPadre_ID`)
REFERENCES `padres` (`padre_ID`)
ON DELETE CASCADE ON UPDATE CASCADE;
Descargar archivo:
bd_padres_hijos.sql
;
Como se puede ver, la tabla hijos a cambiado su estructura, ahora, además de la llave primaria (PRIMARY KEY
) hijo_ID, tenemos una llave externa o foránea (KEY
) hijoPadre_ID
.
Para mayor información consulte el apartado Claves foreaneas de este curso.