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

integridad referencial

Estas en el tema de integridad referencial en el foro de Mysql en Foros del Web. como funciona la integridad referencial con las claves forañas en mysql?esta bien lo que pienso?si tengo las siguiente tablas con sus atributos: PERSONA EMPLEO ----------- ...
  #1 (permalink)  
Antiguo 11/03/2013, 20:52
 
Fecha de Ingreso: octubre-2010
Mensajes: 219
Antigüedad: 14 años, 2 meses
Puntos: 2
Pregunta integridad referencial

como funciona la integridad referencial con las claves forañas en mysql?esta bien lo que pienso?si tengo las siguiente tablas con sus atributos:

PERSONA EMPLEO
----------- -------------
nombre id_empleo(pk)
edad nombre
dni (pk) dni_empleado_FK


por ej: con la integridad cascade para actualizar y eliminar . dni_empleado_FK es foraneo
a dni .
yo puedo agregar un dni_empleado_FK que no este en dni?
si actualizo el dni_empleado_FK,se actualiza el de dni?
  #2 (permalink)  
Antiguo 12/03/2013, 02:38
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 9 meses
Puntos: 574
Respuesta: integridad referencial

Cita:
si actualizo el dni_empleado_FK,se actualiza el de dni?
No exactamente al reves cuando hagas algo en la tabla referenciada (en este caso persona) se reflejará en la tabla referenciate (en este caso empleo). Si eliminas un empleado se eliminaran sus empleos...

Cita:
yo puedo agregar un dni_empleado_FK que no este en dni?
No si agregas un dni en EMPLEOS que no este en PERSONAS te saltará un error y no te permitira hacer la inserción. Una FK solo admite valores que esten en el campo referenciado (en este caso en dni de persona) y nulos... Es decir puedes insertar emplos sin empleados pero no emplear personas que no tengas fichadas.

En personas puedes insertar personas sin empleo pero no personas sin dni (PK).
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 12/03/2013, 10:43
 
Fecha de Ingreso: octubre-2010
Mensajes: 219
Antigüedad: 14 años, 2 meses
Puntos: 2
Pregunta Respuesta: integridad referencial

gracias por la respuesta muy clara,pasa que yo estoy en workbench y cuando pongo una foranea no cumple con la integridad,osea agrego un empleo con unempleado con no existe y me lo deja,que puede ser,mira te dejo el escript que me genera:

este ejemplo no es el de persona empleo seria las tablas a y b cada una con su clave ide y b una foranea ide_a_fk

Código MySQL:
Ver original
  1. SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
  2.  
  3. SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
  4.  
  5. SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
  6.  
  7.  
  8.  
  9. DROP SCHEMA IF EXISTS `base2` ;
  10.  
  11. CREATE SCHEMA IF NOT EXISTS `base2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
  12.  
  13. USE `base2` ;
  14.  
  15.  
  16.  
  17. -- -----------------------------------------------------
  18.  
  19. -- Table `base2`.`a`
  20.  
  21. -- -----------------------------------------------------
  22.  
  23. DROP TABLE IF EXISTS `base2`.`a` ;
  24.  
  25.  
  26.  
  27. CREATE  TABLE IF NOT EXISTS `base2`.`a` (
  28.  
  29.   `ide` INT NOT NULL ,
  30.  
  31.   PRIMARY KEY (`ide`) )
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38. -- -----------------------------------------------------
  39.  
  40. -- Table `base2`.`b`
  41.  
  42. -- -----------------------------------------------------
  43.  
  44. DROP TABLE IF EXISTS `base2`.`b` ;
  45.  
  46.  
  47.  
  48. CREATE  TABLE IF NOT EXISTS `base2`.`b` (
  49.  
  50.   `ide` INT NOT NULL ,
  51.  
  52.   `ide_a_fk` INT NULL ,
  53.  
  54.   PRIMARY KEY (`ide`) ,
  55.  
  56.   INDEX `ide_a_fk_idx` (`ide_a_fk` ASC) ,
  57.  
  58.   CONSTRAINT `ide_a_fk`
  59.  
  60.     FOREIGN KEY (`ide_a_fk` )
  61.  
  62.     REFERENCES `base2`.`a` (`ide` )
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69. USE `base2` ;
  70.  
  71.  
  72.  
  73.  
  74.  
  75. SET SQL_MODE=@OLD_SQL_MODE;
  76.  
  77. SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
  78.  
  79. SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
  #4 (permalink)  
Antiguo 12/03/2013, 10:58
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: integridad referencial

En ese ejemplo, la tabla B tiene la FK definida como nulable, lo que significa que es una relación no mandatoria, sino opcional.
En definitiva, te permitirá ingresar registros sin problemas en tanto el campo FK sea:
1) Un valor que existe en la tabla A.
2) NULL.

Lo que no te permitirá es poner un valor que no exista en la tabla A.

¿Se entiende?
El error básico consiste en que si defines una FK normalmente se la pone como NOT NULL para evitar que se ingresen datos huérfanos.

En definitiva, las restricciones funcionan bien, pero la lógica aplicada al diseño está mal, porque no estás cumpliendo con las reglas de negocio del sistema.

¿Se entiende la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 13/03/2013, 04:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 9 meses
Puntos: 574
Respuesta: integridad referencial

Cita:
...o sea agrego un empleo con un empleado con no existe y me lo deja...
Estas seguro?

Si entras un nuevo empleado e a te debe dejar.

Pero si antes lo entras en b NO TE DEJARÁ.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Etiquetas: consultasql, integridad
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 06:10.