Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Problemas con llaves foráneas

Estas en el tema de Problemas con llaves foráneas en el foro de Mysql en Foros del Web. Que tal a todos pues bueno el problema que tengo es el siguiente quiero crear unas llaves foráneas en mi BD de MySQL pero cuando ...
  #1 (permalink)  
Antiguo 23/07/2009, 19:49
 
Fecha de Ingreso: junio-2009
Mensajes: 45
Antigüedad: 14 años, 9 meses
Puntos: 1
Pregunta Problemas con llaves foráneas

Que tal a todos pues bueno el problema que tengo es el siguiente quiero crear unas llaves foráneas en mi BD de MySQL pero cuando ejecuto la instrucción que muestro a continuación:

Código PHP:
ALTER TABLE `alumnos`
  
ADD CONSTRAINT `id_grupo`
  
FOREIGN KEY (`id_grupo`)
    
REFERENCES `grupos`(`id_grupo`)
    
ON DELETE RESTRICT
    ON UPDATE RESTRICT

Me presenta este error:

Código:
SQL Error: Can't create table '.\jbg\#sql-630_1f3.frm' (errno: 150)
No se en que este mal la instrucción que realizo, en ninguna de las tablas me deja realizar dicha operación si alguien sabe por que me manda este error y alguna solución se los agradecería mucho.

Bueno todo esto lo realizo por medio de MySQL Administrator y también SQL Maestro for MYSQL.

Última edición por kain_raziel; 23/07/2009 a las 19:59 Razón: actualizar
  #2 (permalink)  
Antiguo 23/07/2009, 20:43
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Problemas con llaves foráneas

Hay que analizar la definición de las tablas involucradas.
¿Podrías poner los CREATE de ambas?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 24/07/2009, 07:37
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Problemas con llaves foráneas

cambia el nombre del constraint de id_grupo a id_grupo_fk.
Debes asegurarte que la tabla grupos ya haya sido creada, al igual que la tabla alumnos.

Si sigues con el problema, como dice gnzsoloyo, puedes compartir las sentencias create table.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 13/08/2009, 23:23
 
Fecha de Ingreso: junio-2009
Mensajes: 45
Antigüedad: 14 años, 9 meses
Puntos: 1
Respuesta: Problemas con llaves foráneas

que tal lamento el retraso pero tuve algunos problemas para conectarme por un tiempo, pero el problema aun no lo puedo solucionar y pues aquí les pongo como creo las BD:

Código PHP:
CREATE TABLE `alumnos` (
  `
id_alumno`    int(5UNSIGNED NOT NULL DEFAULT '0',
  `
nombre`       varchar(25NOT NULL DEFAULT '-',
  `
ape_paterno`  varchar(25NOT NULL DEFAULT '-',
  `
ape_materno`  varchar(25NOT NULL DEFAULT '-',
  `
fecha_nac`    date DEFAULT '2000-01-01',
  `
sexo`         varchar(2NOT NULL DEFAULT '-',
  `
calle_num`    varchar(50NOT NULL DEFAULT '-',
  `
colonia`      varchar(40NOT NULL DEFAULT '-',
  `
cp`           int(5UNSIGNED DEFAULT '0',
  `
entidad`      varchar(3) DEFAULT '-',
  `
nom_tutor`    varchar(55NOT NULL DEFAULT '-',
  `
telefono`     varchar(15) DEFAULT '-',
  `
rfc`          varchar(14) DEFAULT '-',
  `
curp`         varchar(19) DEFAULT '-',
  `
id_grupo`     int(5UNSIGNED NOT NULL DEFAULT '0',
  
/* Keys */
  
PRIMARY KEY (`id_alumno`)
ENGINE InnoDB
  ROW_FORMAT 
DYNAMIC;

CREATE INDEX `id_alumno`
  
ON `alumnos`
  (`
id_alumno`);

-----------------------------------------------------------------------

CREATE TABLE `grupos` (
  `
id_grupo`    int(5NOT NULL DEFAULT '0',
  `
grado`       int(2NOT NULL DEFAULT '0',
  `
grupo`       varchar(2NOT NULL DEFAULT '-',
  `
turno`       varchar(2NOT NULL DEFAULT '-',
  `
num_alum`    int(3NOT NULL DEFAULT '0',
  `
id_docente`  int(5NOT NULL DEFAULT '0',
  
/* Keys */
  
PRIMARY KEY (`id_grupo`)
ENGINE InnoDB
  ROW_FORMAT 
DYNAMIC;

CREATE INDEX `id_grupo`
  
ON `grupos`
  (`
id_grupo`); 
bueno pues estas dos son las tablas que tengo relacionadas pero aun no puedo realizar lo de las llaves foráneas espero me puedan ayudar.
  #5 (permalink)  
Antiguo 14/08/2009, 05:25
Avatar de 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, 4 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)
  #6 (permalink)  
Antiguo 17/08/2009, 09:25
 
Fecha de Ingreso: junio-2009
Mensajes: 45
Antigüedad: 14 años, 9 meses
Puntos: 1
De acuerdo Respuesta: Problemas con llaves foráneas

ok lo tomare en cuenta y muchas gracias por la ayuda, y es que como apenas empiezo con esto de MySQL no lo se hacer muy bien todavía como solo usaba SQL aunque no cambia mucho si hay cosas que no son iguales pero me esforzare un poco más con todo esto.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:38.