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

LLave primara compuesta con valores NULL

Estas en el tema de LLave primara compuesta con valores NULL en el foro de Mysql en Foros del Web. Hola, me di a la tarea de realizar una pagina web para aprender MYSQL y bases de datos, pero me acabo de topar con pared ...
  #1 (permalink)  
Antiguo 14/09/2011, 15:54
Avatar de Chico3001  
Fecha de Ingreso: septiembre-2011
Ubicación: Mexico, DF
Mensajes: 112
Antigüedad: 13 años, 2 meses
Puntos: 12
LLave primara compuesta con valores NULL

Hola, me di a la tarea de realizar una pagina web para aprender MYSQL y bases de datos, pero me acabo de topar con pared y por eso acudo a ustedes....

Resulta que tengo 3 tablas, una de personas, una de empresas y una de telefonos, y las estoy enlazando por medio de una 4a tabla con llaves primarias foraneas, necesito revisar que no existan duplicados, sin embargo algunas veces un telefono puede estar asignado a una persona, a una empresa o a ambos, por lo que 2 llaves tendrian que ser NULL, y segun tengo entendido esto no es posible

De que manera se podria diseñar la tabla para que se eviten valores duplicados permitiendo campos NULL en 1 de 2 columnas?

Les dejo la tabla que tengo hasta el momento

Código:
CREATE  TABLE IF NOT EXISTS `mundose1_nyx`.`empresas_personas` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `id_grupo` INT UNSIGNED NOT NULL ,
  `id_empresa` INT UNSIGNED NULL ,
  `id_persona` INT UNSIGNED NULL ,
  `id_telefono` INT UNSIGNED NOT NULL ,
  `extension` CHAR(5) NULL ,
  `puesto` VARCHAR(20) NULL ,
  `departamento` VARCHAR(20) NULL ,
  PRIMARY KEY (`id`, `id_grupo`, `id_empresa`, `id_persona`, `id_telefono`) ,
  INDEX `fk_telefonos_empresas_nombres1` (`id_empresa` ASC) ,
  INDEX `fk_telefonos_personas_nombres1` (`id_persona` ASC) ,
  INDEX `fk_telefonos_config_grupos1` (`id_grupo` ASC) ,
  INDEX `fk_empresas_personas_telefonos1` (`id_telefono` ASC) ,
  CONSTRAINT `fk_telefonos_empresas_nombres1`
    FOREIGN KEY (`id_empresa` )
    REFERENCES `mundose1_nyx`.`empresas_nombres` (`id_empresa` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_telefonos_personas_nombres1`
    FOREIGN KEY (`id_persona` )
    REFERENCES `mundose1_nyx`.`personas_nombres` (`id_persona` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_telefonos_config_grupos1`
    FOREIGN KEY (`id_grupo` )
    REFERENCES `mundose1_nyx`.`config_grupos` (`id_grupo` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_empresas_personas_telefonos1`
    FOREIGN KEY (`id_telefono` )
    REFERENCES `mundose1_nyx`.`telefonos` (`id_telefono` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
***** UPDATE *****

Acabo de encontrar una posible solucion a mi problema, le añadi un indice unico con las columnas id_grupo, id_empresa, id_persona, e id_telefono, sin embargo la documentacion especifica ( y ya lo comprobe :D) que no se puede realizar la comprobacion con valores NULL...

Existira alguna manera de detectar un registro duplicado considerando valores NULL?

Gracias...

Última edición por Chico3001; 14/09/2011 a las 19:04
  #2 (permalink)  
Antiguo 14/09/2011, 19:24
Avatar de Chico3001  
Fecha de Ingreso: septiembre-2011
Ubicación: Mexico, DF
Mensajes: 112
Antigüedad: 13 años, 2 meses
Puntos: 12
Respuesta: LLave primara compuesta con valores NULL

Otro Update...

Parece que es definitivo.... INNODB no puede realizar comprobaciones con valores NULL, asi que tendre que ponerlos a algun valor especial para poder manejarlos...

De todos modos si hay alguna otra manera me gustaria conocerla....

Gracias..
  #3 (permalink)  
Antiguo 14/09/2011, 19:35
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 primara compuesta con valores NULL

Lo que no puedes hacer (en ningún DBMS que se respete) es usar operadores lógicos para comparar campos NULL, porque los operadores sólo funcionan con datos, y NULL no es un dato.
Cuando un campo es NULL sólo se puede establecer si ese es su estado, ya que eso es lo que NULL es: Un estado, ,un puntero a la nada... y la nada no es comparable.


Por otro lado:
- No puedes, bajo ninguna circunstancia crear una PK con valores NULL, porque es una violación al modelo relacional.
- Si puedes, en MySQL crear una FK que admita NULL si y sólo si el campo referenciado es parte de un indice UNIQUE, pero en ese caso sólo puede existir uno en la tabla de referencia.
- Si tienes una estructura tal que una tabla relacional pueda contener una PK con valores NULL, lo que tienes es un pésimo diseño de la base, porque los datos elegidos para PK nunca deben ser NULL, en ningún caso.
- Si tienes una tabla relacional cuya PK se origina en las PK de más de dos tablas, entonces tienes un error de diseño severo, porque según el paradigma relacional, sólo se aceptan entidades ternarias y no cuaternarias o superiores.
- Lo que sí puede existir es una tabla relacional que tenga una relación no identificatoria con otras tablas, cuyas PK no son parte de la PK de esa tabla.

¿Se entiende?
__________________
¿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: campos, compuesta, llave, null, sql, tabla
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:38.