Ver Mensaje Individual
  #5 (permalink)  
Antiguo 14/08/2009, 05:25
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problemas con llaves foráneas

El problema venía por dos lados:
1) No puedes crear una FK entre dos campos que no tienen el mismo tipo o el mismo rango. En el caso de intentar crear una FK en ID_GRUPO, el campo es UNSIGNED en AALUMNOS y SIGNED en GRUPOS. Esto hace que no tengan el mismo rango de representación, y por ende existe un 50 de valores de cada uno que no podrá existir en la otra tabla. Por eso MySQL no te deja hacerlo.
2) Crear un índice INDEX en GRUPO.ID_GRUPO, siendo este PK, es redundante. Estás indexando dos veces la misma información, con lo que el sistema deberá mantener un índice innecesario. Además, siendo el indice PK, jamás se repetirá un valor, así que ¿para qué hacer un INDEX?
Los códigos necesarios serían:
Código sql:
Ver original
  1. DROP TABLE IF EXISTS `grupos`;
  2. CREATE TABLE  `grupos` (
  3.   `id_grupo` INT(5) UNSIGNED NOT NULL DEFAULT '0',
  4.   `grado` INT(2) NOT NULL DEFAULT '0',
  5.   `grupo` VARCHAR(2) NOT NULL DEFAULT '',
  6.   `turno` VARCHAR(2) NOT NULL DEFAULT '',
  7.   `num_alum` INT(3) NOT NULL DEFAULT '0',
  8.   `id_docente` INT(5) NOT NULL DEFAULT '0',
  9.   PRIMARY KEY  (`id_grupo`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
  11.  
  12. DROP TABLE IF EXISTS `alumnos`;
  13. CREATE TABLE  `alumnos` (
  14.   `id_alumno` INT(5) UNSIGNED NOT NULL DEFAULT '0',
  15.   `nombre` VARCHAR(25) NOT NULL DEFAULT '',
  16.   `ape_paterno` VARCHAR(25) NOT NULL DEFAULT '',
  17.   `ape_materno` VARCHAR(25) NOT NULL DEFAULT '',
  18.   `fecha_nac` DATE DEFAULT '2000-01-01',
  19.   `sexo` VARCHAR(2) NOT NULL DEFAULT '',
  20.   `calle_num` VARCHAR(50) NOT NULL DEFAULT '',
  21.   `colonia` VARCHAR(40) NOT NULL DEFAULT '',
  22.   `cp` INT(5) UNSIGNED DEFAULT '0',
  23.   `entidad` VARCHAR(3) DEFAULT '',
  24.   `nom_tutor` VARCHAR(55) NOT NULL DEFAULT '',
  25.   `telefono` VARCHAR(15) DEFAULT '',
  26.   `rfc` VARCHAR(14) DEFAULT '',
  27.   `curp` VARCHAR(19) DEFAULT '',
  28.   `id_grupo` INT(5) UNSIGNED NOT NULL DEFAULT '0',
  29.   PRIMARY KEY  (`id_alumno`),
  30.   KEY `index_grupos` (`id_grupo`),
  31.   CONSTRAINT `FK_alumnos_grupos` FOREIGN KEY (`id_grupo`) REFERENCES `grupos` (`id_grupo`)
  32. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;

Hay un tip de sugerencia adicional: No es muy buena idea poner un valor por DEFAULT '-'; Esto puede no indicarte si el usuario ingresó o no un valor, ya que bien pudo haber ingresado eso... y no sabrías si lo omitió o lo puso él. Es mejor siempre dejar un DEFAULT NULL o un DEFAULT '', que es el caracter vacío.
Además, en muchas situaciones puede ser práctico dejar que el valor no mandatorio sea NULL, ya que responde mejor ante determinadas consultas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)