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

Clave foranea con valor nulo.

Estas en el tema de Clave foranea con valor nulo. en el foro de Mysql en Foros del Web. Hola, tengo una duda con las claves foraneas y si pueden contener un valor nulo. Voy a explicar mi ejemplo para que se entienda mejor: ...
  #1 (permalink)  
Antiguo 10/05/2011, 05:57
 
Fecha de Ingreso: marzo-2011
Mensajes: 4
Antigüedad: 13 años, 1 mes
Puntos: 0
Clave foranea con valor nulo.

Hola, tengo una duda con las claves foraneas y si pueden contener un valor nulo.
Voy a explicar mi ejemplo para que se entienda mejor:

Tengo una tabla de clientes, y una tabla de albumes.
El album que es de un cliente, solo puede verlo ese cliente, por tanto tengo una clave foranea id_cliente en album que hace referencia al id de cliente. Hasta aqui bien.

El problema es que los albumes tambien pueden ser publicos, es decir, que todo el mundo puede verlos, no tiene un cliente y por tanto el valor id_cliente seria nulo.

Es posible hacer que esta clave forane id_cliente sea nula????

La otra opcion que se me ocurre es crear un cliente que sea publico, pero claro los datos de este registros como nombre, email etc, serian inventados y no me parece una solucion elegante.

Alguna idea??, Muchas gracias.
  #2 (permalink)  
Antiguo 10/05/2011, 06:11
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, 5 meses
Puntos: 2658
Respuesta: Clave foranea con valor nulo.

Técnicamente hablando, no debería darse que exista una FK que pueda ser NULL, pero existe una posibilidad.
MySQL admite la existencia de FK nulas si y sólo si el campo de referencia en la tabla origen no es una clave primaria sino clave candidata. Las claves candidatas son aquellas en las que se puede crear un índice UNIQUE sin ser PK, y se pueden definir en campos que pueden tener como valor NULL. Es el único caso.
¿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)
  #3 (permalink)  
Antiguo 10/05/2011, 06:29
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Clave foranea con valor nulo.

Pues yo veo más casos gnzsoloyo, te cuento uno que teníamos en mi trabajo (lo voy a simplificar)

Teníamos una tabla con citas médicas y desde una cita, un médico podía pedir otra por lo que las citas tenían un campo de CITA_PADRE que era una FK a la propia tabla de citas, pero no todas las citas estaban pedidas desde otra por lo que no en todas ellas ese campo estaba informado.

A lo mejor estabamos equivocados en el diseño de nuestra base de datos, aunque creo que (esa parte) estaba bastante bien.

Para la pregunta del primer forero, si, se puede tener un campo que sea FK y contenga un valor nulo.
  #4 (permalink)  
Antiguo 10/05/2011, 10:09
 
Fecha de Ingreso: marzo-2011
Mensajes: 4
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Clave foranea con valor nulo.

Entiendo lo que decis, pero me gustaria saber como debo construir las tablas.
Yo de momento las tengo de la siguiente forma:

CREATE TABLE cliente (
`ID` INT NOT NULL AUTO_INCREMENT ,
`NOMBRE` VARCHAR( 255 ) NOT NULL ,
`EMAIL` VARCHAR( 255 ) NOT NULL,
`USER` VARCHAR( 255 ) NOT NULL,
`PASS` VARCHAR( 255 ) NOT NULL,
PRIMARY KEY ( `ID` ),
UNIQUE (EMAIL),
UNIQUE (USER)
) TYPE= InnoDB;


CREATE TABLE `album` (
`ID` INT NOT NULL AUTO_INCREMENT ,
`NOMBRE` VARCHAR( 255 ) NOT NULL ,
`FECHA` DATE,
`PUBLICO` BOOLEAN NOT NULL ,
`ID_CLIENTE` INT ,
PRIMARY KEY (`ID`),
UNIQUE (NOMBRE),
INDEX(ID_CLIENTE),
FOREIGN KEY(ID_CLIENTE) REFERENCES CLIENTE(ID)
ON DELETE CASCADE ON UPDATE CASCADE
) TYPE=InnoDB;
  #5 (permalink)  
Antiguo 10/05/2011, 11:34
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, 5 meses
Puntos: 2658
Respuesta: Clave foranea con valor nulo.

Yo hablaba de algo así:
Código MySQL:
Ver original
  1. DROP TABLE IF EXISTS cliente;
  2.  
  3. CREATE TABLE cliente (
  4. `NOMBRE` VARCHAR( 255 ) NOT NULL ,
  5. `EMAIL` VARCHAR( 255 ) NULL,
  6. `USER` VARCHAR( 255 ) NOT NULL,
  7. `PASS` VARCHAR( 255 ) NOT NULL,
  8. PRIMARY KEY ( `ID` ),
  9. UNIQUE (EMAIL),
  10.  
  11. CREATE TABLE `album` (
  12. `NOMBRE` VARCHAR( 255 ) NOT NULL ,
  13. `FECHA` DATE,
  14. `PUBLICO` BOOLEAN NOT NULL ,
  15. `EMAIL` varchar(255) ,
  16. PRIMARY KEY (`ID`),
  17. UNIQUE (NOMBRE),
  18. INDEX(EMAIL),
  19. FOREIGN KEY(EMAIL) REFERENCES CLIENTE(EMAIL)

Postdata: Los campos VARCHAR no tienen como límite los 255 caracteres. Eso fue hasta la versión anterior a la 5.0.3
__________________
¿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: clave, nulo, foreignkey
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 14:55.