Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
MySQL 4.0 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.
Para dar un enfoque de integridad referencial, podemos decir que cuando un registro en
una tabla haga referencia a un registro en otra tabla, el registro correspondiente debe
existir
Claves primarias
Las claves juegan un papel muy importante no sólo en MySQL, sino en cualquier base
de datos relacional. De manera simple, las claves ayudan a indexar los datos en las
tablas y proporcionan una manera rápida y eficiente de buscar los datos en las mismas,
además de que permiten preservar la integridad de los datos.
Entonces una clave primaria, es una clave candidata, que ha sido diseñada para
identificar de manera única a los registros de una tabla a través de toda la estructura de
la base de datos. De esa manera, para poder establecer una relación entre dos tablas, es
necesario asignar un campo en común a las dos tablas
La selección de una clave primaria es muy importante en el diseño de una tabla y más
aún en el de una base de datos, ya que es un elemento clave de los datos, que facilita la
unión de tablas y el concepto total de una base de datos relacional.
Claves Foráneas
Una clave foránea, es una clave primaria copiada en otra tabla, es decir un campo en
una tabla que se corresponde con la clave primaria de otra tabla, con el fin de poder
relacionar y a la vez referenciar ambas para así poder ubicar los datos más rápido.
Las relaciones de claves foráneas se describen como relaciones padre-hijo, y se dice que
un registro es huérfano cuando su padre ya no existe.
Cuando en una base de datos se da una situación como esta, se dice que se tiene una
integridad referencial pobre. Generalmente esto va ligado a un mal diseño, y puede
generar otro tipo de problemas en la base de datos, por lo tanto debemos evitar esta
situación siempre que sea posible.
En versiones anteriores a MySQL 4.0 no se esforzaba en evitar este tipo de situaciones,
y la responsabilidad pasaba a la aplicación, que debia de controlar esas situaciones. Para
muchos desarrolladores, esta no era una situación del todo grata, y por lo tanto no se
consideraba a MySQL para ser usado en proyectos grandes y serios.
Las claves foráneas tienen que ver precisamente con la integridad referencial, lo que
significa que si una clave foránea contiene un valor, ese valor se refiere a un registro
existente en la tabla relacionada.
Estrictamente hablando, para que un campo sea una clave foránea, éste necesita ser
definido como tal al momento de crear una tabla. Se pueden definir claves foráneas en
cualquier tipo de tabla de MySQL, pero únicamente tienen sentido cuando se usan
tablas del tipo InnoDB.
InnoDB no crea de manera automática índices en las claves foráneas o en las claves
referenciadas, así que se deberá 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)
) TYPE = INNODB;
En las versiones 3.23.50 y menores no deben usarse las sentencias ALTER TABLE o
CREATE INDEX en tablas que ya tienen definidas restricciones de claves foráneas o
bien, que son referenciadas en restricciones de claves foráneas: cualquier sentencia
ALTER TABLE elimina todas las restricciones de claves foráneas definidas para la
tabla.
No debe usarse una sentencia ALTER TABLE en una tabla que está siendo
referenciada, si se quiere modificar el esquema de la tabla, se recomienda eliminar la
tabla y volverla a crear con el nuevo esquema. Cuando MySQL hace un ALTER
TABLE, puede que use de manera interna un RENAME TABLE, y por lo tanto, se
confundan las restricciones de clave foránea que se refieren a la tabla. Esta restricción
aplica también en el caso de la sentencia CREATE INDEX, ya que MySQL la procesa
como un ALTER TABLE.
La restricción de clave foránea asegura que nuestros datos mantienen su integridad. Sin
embargo, ¿qué sucede cuando eliminamos algún registro?
Para eliminar la clave foránea se tiene que especificar el ID que ha sido generado y
asignado internamente por MySQL a la clave foránea.
Una de las principales bondades de las claves foráneas es que permiten eliminar y
actualizar registros en cascada, en donde todos los registros relacionados son eliminados
o actualizados de acuerdo a las relaciones de clave foránea
Con las restricciones de clave foránea podemos eliminar un registro de la tabla “padre”
(la que contiene la clave primaria) y a la vez eliminar un registro de la tabla “hija” (la
que contiene la clave foránea) usando sólo una sentencia DELETE.
Las opciones estándar cuando se elimina una registro con clave foránea son:
• ON DELETE RESTRICT
• ON DELETE NO ACTION
• ON DELETE CASCADE
• ON DELETE SET NULL
Si se especifica ON DELETE SET NULL, las filas en la tabla “hija” son actualizadas
automáticamente poniendo en las columnas de la clave foránea el valor NULL. Si se
especifica una acción SET NULL, debemos asegurarnos de no declarar las columnas en
la tabla como NOT NULL.
Estas opciones son muy similares cuando se ejecuta una sentencia UPDATE, en lugar
de una sentencia DELETE. Estas son:
• ON UPDATE CASCADE
• ON UPDATE SET NULL
• ON UPDATE RESTRICT