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 originalDROP TABLE IF EXISTS `grupos`;
CREATE TABLE `grupos` (
`id_grupo` INT(5) UNSIGNED NOT NULL DEFAULT '0',
`grado` INT(2) NOT NULL DEFAULT '0',
`grupo` VARCHAR(2) NOT NULL DEFAULT '',
`turno` VARCHAR(2) NOT NULL DEFAULT '',
`num_alum` INT(3) NOT NULL DEFAULT '0',
`id_docente` INT(5) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_grupo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
DROP TABLE IF EXISTS `alumnos`;
CREATE TABLE `alumnos` (
`id_alumno` INT(5) UNSIGNED NOT NULL DEFAULT '0',
`nombre` VARCHAR(25) NOT NULL DEFAULT '',
`ape_paterno` VARCHAR(25) NOT NULL DEFAULT '',
`ape_materno` VARCHAR(25) NOT NULL DEFAULT '',
`fecha_nac` DATE DEFAULT '2000-01-01',
`sexo` VARCHAR(2) NOT NULL DEFAULT '',
`calle_num` VARCHAR(50) NOT NULL DEFAULT '',
`colonia` VARCHAR(40) NOT NULL DEFAULT '',
`cp` INT(5) UNSIGNED DEFAULT '0',
`entidad` VARCHAR(3) DEFAULT '',
`nom_tutor` VARCHAR(55) NOT NULL DEFAULT '',
`telefono` VARCHAR(15) DEFAULT '',
`rfc` VARCHAR(14) DEFAULT '',
`curp` VARCHAR(19) DEFAULT '',
`id_grupo` INT(5) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`id_alumno`),
KEY `index_grupos` (`id_grupo`),
CONSTRAINT `FK_alumnos_grupos` FOREIGN KEY (`id_grupo`) REFERENCES `grupos` (`id_grupo`)
) 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.