miércoles, 4 de febrero de 2009

MYSQL no cumple las claves ajenas!!.

EJEMPLO.

Tenemos la tabla cantantes que tiene como clave primaria titulo y cantante, y como clave ajena cantante.

mysql> describe cd;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| titulo | varchar(30) | NO | PRI | | |
| cantante | int(11) | NO | PRI | | |
| coste | int(11) | YES | | NULL | |
| copias | int(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+

INSERCIÓN QUE CUMPLA LA RESTRICCIÓN.

Si realizamos una insercion de un cantante que existe en la tabla de cantantes nos deja --> cumple la restricción de integridad.

mysql> insert into cd (titulo,cantante) values ('kk',10);
Query OK, 1 row affected (0.33 sec)

INSERCIÓN QUE NO CUMPLA LA RESTRICCIÓN.

Si realizamos una inserción de un cantante que no existe en la tabla de cantantes, nos debería decir que viola la restriccion de integridad.

mysql> insert into cd (titulo,cantante) values ('kk',103233);
Query OK, 1 row affected (0.00 sec)

PROBLEMA

No nos sirve de nada mantener una base de datos, que no nos asegura las relaciones entre tablas.
No nos va a permitir tener una base de datos consistente.


SOLUCIÓN.

Debemos crear las tablas como innoDB.
Ejemplo:

CREATE TABLE cd(
titulo varchar(30) NOT NULL,
cantante int NOT NULL,
coste int,
copias int,
PRIMARY KEY (titulo, cantante),
FOREIGN KEY(cantante) REFERENCES artista(cif) ON UPDATE CASCADE
)TYPE=INNODB;


Si realizamos una insercción de un cantante que no existe sobre la tabla cantantes, nos dará un error.

mysql> insert into cd (titulo,cantante) values ("titulo 1", 987);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`musicainnodb/cd`, CONSTRAINT `cd_ibfk_1` FOREIGN KEY (`cantante`) REFERENCES `artista` (`cif`) ON UPDATE CASCADE)



CONCLUSION

Como puede ser que el motor de almacenamiento por defecto de MySQL, sea MyISAM, y este no soporte ninguna regla de integridad referencial???..

No tiene sentido que por defecto no se cumpla ni las claves ajenas, y ademas! que me deje meter como clave primaria un vacio!!.

3 comentarios:

  1. Curiosas las cosas que hace el mysql, el otro día volviéndome loco con este tema, porque creaba una clave ajena que dejaba meter valores diferentes a los de la columna que referenciaba (uno ya piensa que se le olvidan las cosas con el alzeimer)
    Danuar Blander

    ResponderEliminar
  2. Curioso verdad Danuar?...Habrá que acordarse de ponerlo de tipo INNODB, si nos interesa mantener la integridad mediante el SGBD.

    ResponderEliminar
  3. Ahora veo que has respondido mi comentario...jajaja, menos mal que ya estamos aprobados :P

    ResponderEliminar

palyginti kainas