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

Llave foranea

Estas en el tema de Llave foranea en el foro de Mysql en Foros del Web. Tengo problemas para crear una llave foranea sobre una tabla ya existente. Esta es la estructura de la tabla 'stockmaster' y el campo que quiero ...
  #1 (permalink)  
Antiguo 12/01/2015, 14:12
 
Fecha de Ingreso: diciembre-2013
Ubicación: Distrito Federal
Mensajes: 17
Antigüedad: 11 años
Puntos: 0
Exclamación Llave foranea

Tengo problemas para crear una llave foranea sobre una tabla ya existente.

Esta es la estructura de la tabla 'stockmaster' y el campo que quiero poner como llave foranea es 'categoria2'

Código MySQL:
Ver original
  1. +------------------+---------------+------+-----+------------+-------+
  2. | Field            | Type          | Null | Key | Default    | Extra |
  3. +------------------+---------------+------+-----+------------+-------+
  4. | stockid          | varchar(20)   | NO   | PRI |            |       |
  5. | categoryid       | varchar(6)    | NO   | MUL |            |       |
  6. | description      | varchar(50)   | NO   | MUL |            |       |
  7. | longdescription  | text          | NO   |     | NULL       |       |
  8. | units            | varchar(20)   | NO   |     | each       |       |
  9. | mbflag           | char(1)       | NO   | MUL | B          |       |
  10. | actualcost       | decimal(20,4) | NO   |     | 0.0000     |       |
  11. | lastcost         | decimal(20,4) | NO   |     | 0.0000     |       |
  12. | materialcost     | decimal(20,4) | NO   |     | 0.0000     |       |
  13. | labourcost       | decimal(20,4) | NO   |     | 0.0000     |       |
  14. | overheadcost     | decimal(20,4) | NO   |     | 0.0000     |       |
  15. | lowestlevel      | smallint(6)   | NO   |     | 0          |       |
  16. | discontinued     | tinyint(4)    | NO   |     | 0          |       |
  17. | controlled       | tinyint(4)    | NO   | MUL | 0          |       |
  18. | eoq              | double        | NO   |     | 0          |       |
  19. | volume           | decimal(20,4) | NO   |     | 0.0000     |       |
  20. | kgs              | decimal(20,4) | NO   |     | 0.0000     |       |
  21. | barcode          | varchar(50)   | NO   |     |            |       |
  22. | discountcategory | char(2)       | NO   | MUL |            |       |
  23. | taxcatid         | tinyint(4)    | NO   | MUL | 1          |       |
  24. | serialised       | tinyint(4)    | NO   |     | 0          |       |
  25. | appendfile       | varchar(40)   | NO   |     | none       |       |
  26. | perishable       | tinyint(1)    | NO   |     | 0          |       |
  27. | decimalplaces    | tinyint(4)    | NO   |     | 0          |       |
  28. | pansize          | double        | NO   |     | 0          |       |
  29. | shrinkfactor     | double        | NO   |     | 0          |       |
  30. | nextserialno     | bigint(20)    | NO   |     | 0          |       |
  31. | netweight        | decimal(20,4) | NO   |     | 0.0000     |       |
  32. | lastcostupdate   | date          | NO   |     | 0000-00-00 |       |
  33. | ieps             | double        | NO   |     | 0          |       |
  34. | iva              | double        | NO   |     | 0          |       |
  35. | pedimento        | varchar(70)   | NO   |     |            |       |
  36. | fecha            | varchar(70)   | NO   |     |            |       |
  37. | aduana           | varchar(70)   | NO   |     |            |       |
  38. | utilidadD        | double        | NO   |     | 0          |       |
  39. | actcode          | int(11)       | NO   |     | 0          |       |
  40. | categoria2       | varchar(6)    | NO   |     |            |       |
  41. +------------------+---------------+------+-----+------------+-------+

La tabla a la que debe hacer refencia esa llave foranea es 'stockcategory2' y el campo es 'categoryid':

Código MySQL:
Ver original
  1. +---------------------+----------+------+-----+---------+-------+
  2. | Field               | Type     | Null | Key | Default | Extra |
  3. +---------------------+----------+------+-----+---------+-------+
  4. | categoryid          | char(6)  | NO   | PRI |         |       |
  5. | categorydescription | char(20) | NO   | MUL |         |       |
  6. +---------------------+----------+------+-----+---------+-------+


La manera como estoy tratando de hacer mi llave foranea es:
Código MySQL:
Ver original
  1. ALTER TABLE stockmaster
  2. ADD CONSTRAINT categoria2
  3. FOREIGN KEY (categoria2)
  4. REFERENCES stockcategory2 (categoryid) ;

Agradecería mucho su ayuda.
  #2 (permalink)  
Antiguo 12/01/2015, 14:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Llave foranea

Te disparará error porque los campos son diferentes.
En stockmaster, el campo es un VARCHAR(6), mientras que en stockcategory2 es un CHAR(6), no es lo mismo.
Las FK deben ser del mismo tipo de columna, longitud, charset y collation de la PK en la tabla referida. No importa si ambas son columnas de caracters, porq2ue el rango de representacion y almacenamiento es diferente entre CHAR y VARCHAR. POr eso no te dejará crearla.
Además, si ya tienes datos en la tabla de la FK, deberás previamente verificar que no haya incosnistencias entre ambas tablas, de lo contrario no podrá genrar la FK.
__________________
¿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 12/01/2015, 14:41
 
Fecha de Ingreso: diciembre-2013
Ubicación: Distrito Federal
Mensajes: 17
Antigüedad: 11 años
Puntos: 0
Respuesta: Llave foranea

Aunque ya cambie el tipo de de la columna 'categoria2' me sigue marcando un error
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`apaztepec`.`#sql-13e0_6dd`, CONSTRAINT `stockmaster_ibfk` FOREIGN KEY (`categoria2`
) REFERENCES `stockcategory2` (`categoryid`))
  #4 (permalink)  
Antiguo 12/01/2015, 14:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Llave foranea

¿Leiste la parte en que te digo que si tienes datos primero debes verificar que no haya inconsistencias?
Si los campos son exactamente del mismo tipo, entonces tienes en este momento registros que no cumplen con la FK que quieres definir...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: foreignkey, table
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 12:18.