You are on page 1of 4

Tipos de tablas en MySQL

1. ISAM.- es el formato de almacenaje mas antiguo, y posiblemente pronto desaparecer. Presentaba limitaciones (los ficheros no eran transportables entre mquinas con distinta arquitectura, no poda manejar ficheros de tablas superiores a 4 gigas). Si aun tienes tablas tipo ISAM, cambialas a MYISAM ya! 2. MYISAM.- es el tipo de tabla por defecto en MySQL desde la versin 3.23. Optimizada para sistemas operativos de 64 bits, permite ficheros de mayor tamao que ISAM. Adems los datos se almacenan en un formato independiente, con lo que se pueden copiar tablas de una mquina a otra de distinta plataforma. Posibilidad de indexar campos BLOB y TEXT 3. HEAP.- Crea tablas en memoria. Son temporales y desaparecen cuando el servidor se cierra; a diferencia de una tabla TEMPORARY, que solo puede ser accedida por el usuario que la crea, una tabla HEAP puede ser utilizada por diversos usuarios. 4. BDB.- Base de datos Berkeley. TST. Solo en MySQL MAX 5. INNODB.- TST, ACID, con posibilidad de commit, rollback, recuperacin de errores y bloqueo a nivel de fila. 6. MERGE mas que un tipo de tabla es la posibilidad de dividir tablas MYISAM de gran tamao (solo til si son verdaderamente de GRAN tamao) y hacer consultas sobre todas ellas con mayor rapidez. Las tablas deben ser myisam e idnticas en su estructura.

Con MySQL puedes variar el tipo de tabla despus de creada TST se refiere a 'Transactions safe tables', o tablas para transacciones seguras. A este tipo pertenecen DBD y INNODB. Las tablas tipo TST son menos rpidas y ocupan mas memoria, pero a cambio ofrecen mayor seguridad frente a fallos durante la consulta. Aunque ya disponibles, imagino que las tablas TST solo se popularizarn cuando el uso de la versin 4.0 de MySQL se generalice (actualmente en fase gamma) Las tablas TST permiten ir introduciendo consultas y finalizar con un COMMIT (que las ejecuta) o ROLLBACK (que ignora los cambios) ACID es un acrnimo de atomicidad, consistencia, separacion (isolation) y durabilidad. Por atomicidad se quiere significar que son posibles consultas complejas tratadas como una sola, de tal forma que solo se ejecutan cuando todas ellas tienen xito, en caso de que alguna falle no se ejecuta ninguna. Consistencia significa que solo datos vlidos pueden ser escritos en la base de datos. Si se ejecuta una transaccin que compromete la consistencia interna de la base de datos, toda la transaccin debe deshacerse. Por isolation se entiende que las transacciones que tengan lugar simultaneamente deben ejecutarse aisladas unas de otras hasta que finalizan. Y durabilidad, la garanta de que una transaccin enviada a la base de datos no se perder aunque la transaccin sea interrumpida por cualquier motivo.

Muchos habreis tenido problemas al crear tablas relacionadas con MySql, pero de verdad que es bastante sencillo, solo hay que tener en cuenta una serie de premisas:
Las tablas que se van a relacionar tienen que ser tipo InnoDb(InnoDB es el primer tipo de tabla que permite definir estricciones de claves forneas para garantizar la integridad de los datos). Usar sintaxis FOREIGN KEY (campo_fk) REFERENCES nombre_tabla(nombre_campo) Crear un gndice en el campo que ha sido declarado clavefornea

Es necesario el uso de ndices para que la verificacin de las claves forneas sea ms rpida. Vamos a ver un ejemplo de una definicin de 2 tablas relacionadas. Clientes y privilegios: PLAIN TEXT
MySQL:

1. CREATE TABLE clientes 2. ( 3. id_cliente INT NOT NULL AUTO_INCREMENT, 4. nombre VARCHAR(30), 5. PRIMARY KEY (id_cliente) 6. ) TYPE = INNODB; 7. 8. CREATE TABLE privilegios 9. ( 10. id_privilegio INT NOT NULL AUTO_INCREMENT, 11. id_cliente INT NOT NULL, 12. privilegio INT(2), 13. PRIMARY KEY(id_privilegio), 14. INDEX (id_cliente), 15. FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente) 16. ) TYPE = INNODB;

De esta manera estamos relacionando la tabla clientes y privilegios por el campo id_cliente. La clave fornea (FOREIGN KEY) y la Referenciada tienen que tener tipos de datos similares para que puedan ser comparadas sin la necesidad de hacer una conversin de tipos. Ahora ya tenemos las tablas relacionadas y seguro que os haceis la siguiente pregunta:
"Cmo inserto registros en las tablas que tengan claves forneas (FOREIGN KEYS)?"

Bueno, esta pregunta realmente nos la podemos hacer para cuando se inserta un registro, se borra o se actualiza, ya que en las tres lo tendremos que tener en cuenta. Ahora vamos a insertar algn registro para verificar que todo est correcto: PLAIN TEXT
MySQL:

1. INSERT INTO clientes VALUES (1, 'Pedro Picapiedras'); 2. INSERT INTO clientes VALUES (2, 'Pablo Marmol'); 3. INSERT INTO clientes VALUES (3, 'Ana Botella');

PLAIN TEXT
MySQL:

1. INSERT INTO privilegios VALUES (1,1,10); 2. INSERT INTO privilegios VALUES (2,3,05); 3. INSERT INTO privilegios VALUES (3,2,01);

Nota: No me pregunteis porque he puesto Ana Botella dentro de esta categora de clientes Hasta ahora ha ido todo bien, pero que pasara si intentamos insertar un registro en la tabla "privilegios" en el que nos refiramos a un cliente que no exista en la tabla clientes?, vamos a probarlo: PLAIN TEXT
MySQL:

1. INSERT INTO privilegios VALUES (4,5,10);

Pues s nos tiene que devolver un error tal como este:


"ERROR 1216: Cannot add or update a child row: a foreign key constraint fails"

La razn es bastante evidente, estamos intentando insertar un registro en la tabla privilegios sobre un cliente "id_cliente=5", y hasta el momento no existe. Ahora vamos a intentar eliminar un registro de la tabla clientes: PLAIN TEXT
MySQL:

1. DELETE FROM cliente WHERE id_cliente=3;

Debido a que tenemos la restriccin de la clave fornea no permitir eliminar el registro puesto que se hace referencia a l en la tabla "privilegios", por lo tanto Mysql nos devolvera el siguiente error:
"ERROR 1217: Cannot delete or update a parent row: a foreign key constraint fails"

Para eliminar este tipo de registros con claves forneas existen lo que se llama eliminacin en CASCADA, en la que todos los registros relacionados se eliminan segn las relaciones de claves forneas. Para llevar a cabo una eliminacin de todos los registros relacionados por las claves forneas en distintas tablas se usa la funcion "ON DELETE CASCADE".
Si se especifica ON DELETE CASCADE, y una fila en la tabla padre es eliminada, entonces se eliminarn las filas de la tabla hijo cuya clave fornea sea igual al valor de la clave referenciada en la tabla padre. Esta accin siempre ha estado disponible en MySQL. Fuente: Mysql-hispano.org

Veamos un ejemplo de eliminacin en cascada: PLAIN TEXT


MySQL:

1. ALTER TABLE privilegios ADD FOREIGN KEY(id_cliente) 2. REFERENCES cliente(id_cliente) ON DELETE CASCADE;

Con esta sentencia, ya tendremos dispuesta la tabla para que se pueda eliminar en cascada. Por lo tanto si queremos eliminar ahora al cliente "Ana Botella", tan slo tendriamos que ejecutar lo sisguiente: PLAIN TEXT
MySQL:

1. DELETE FROM cliente WHERE id_cliente=3;

Si haceis una consulta ahora en las dos bases de datos, "clientes" y "privilegios", vereis como se ha eliminado "Ana Botella" de las dos tablas. Al igual que la eliminacin tambin podemos actuar en cascada con las actualizaciones con la sentencia "ON UPDATE CASCADE". Esto es todo, espero ayudaros a entender un poco mejor la integridad referencial en Mysql y la relacin entre tablas.

You might also like