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

Evitar registro duplicado en tabla de BD relacional

Estas en el tema de Evitar registro duplicado en tabla de BD relacional en el foro de Mysql en Foros del Web. Hola amigos! Tengo una duda, mejor dicho no sé como encarar este problema: Tengo una base de datos con tres tablas: Digamos que los nombres ...
  #1 (permalink)  
Antiguo 14/10/2011, 13:15
 
Fecha de Ingreso: septiembre-2008
Mensajes: 18
Antigüedad: 15 años, 7 meses
Puntos: 0
Evitar registro duplicado en tabla de BD relacional

Hola amigos!

Tengo una duda, mejor dicho no sé como encarar este problema:
Tengo una base de datos con tres tablas:
Digamos que los nombres son: Especie Nombres y Nombre_y_especie

Especie y Nombres tienen un sólo campo (nombre) que es a su vez primaryKey.

Nombre_y_especie tiene dos campos(nombre y especie) que son tipo index. Solo pueden contener valores que estén definidos en las tablas Especie y Nombres.

Aqui viene mi problema / duda:

la tabla Nombre_y_especie puede tener por ejemplo:
ave | gallina
ave | aguila
animal | gallina
animal | aguila
animal | aguila
animal | aguila
ó sea, si repito un registro (como animal | aguila) me lo acepta y no sé cómo hacer para evitarlos.

Alguien me puede tirar un hilo para ver cómo solucionar este problema?

Gracias!
  #2 (permalink)  
Antiguo 14/10/2011, 15:04
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Evitar registro duplicado en tabla de BD relacional

Hola marke10:

Hay varias formas de abordar este problema. No nos dices cómo es la estructura completa de tus tablas, por lo que no puedo darte una respuesta puntual. Una idea sería que tu llave en la tabla Nombres_y_especies fuera una llave compuesta, justamente por los campos nombre y especie, No importa si estos dos campos son a su vez FK sobre otras tablas, Checa este script:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE nombres(nombre VARCHAR(15) NOT NULL, PRIMARY KEY (nombre));
  2. Query OK, 0 rows affected (0.11 sec)
  3.  
  4. mysql> INSERT INTO nombres VALUES ('ave'), ('animal');
  5. Query OK, 2 rows affected (0.05 sec)
  6. Records: 2  Duplicates: 0  Warnings: 0
  7.  
  8. mysql> CREATE TABLE especies(especie VARCHAR(15) NOT NULL, PRIMARY KEY (especie));
  9. Query OK, 0 rows affected (0.13 sec)
  10.  
  11. mysql> INSERT INTO especies VALUES ('gallina'), ('aguila');
  12. Query OK, 2 rows affected (0.06 sec)
  13. Records: 2  Duplicates: 0  Warnings: 0
  14.  
  15. mysql> CREATE TABLE nombres_y_especies (nombre VARCHAR(15) NOT NULL,
  16.     -> especie VARCHAR(15) NOT NULL, PRIMARY KEY (nombre, especie),
  17.     -> FOREIGN KEY (nombre)
  18.     ->     REFERENCES nombres(nombre)
  19.     ->     ON DELETE CASCADE,
  20.     ->  FOREIGN KEY (especie)
  21.     ->     REFERENCES especies(especie)
  22.     ->     ON DELETE CASCADE);
  23. Query OK, 0 rows affected (0.19 sec)
  24.  
  25. mysql> INSERT INTO nombres_y_especies VALUES ('ave', 'aguila'),
  26.     ->('animal', 'gallina');
  27. Query OK, 2 rows affected (0.06 sec)
  28. Records: 2  Duplicates: 0  Warnings: 0
  29.  
  30. mysql> SELECT * FROM nombres_y_especies;
  31. +--------+---------+
  32. | nombre | especie |
  33. +--------+---------+
  34. | ave    | aguila  |
  35. | animal | gallina |
  36. +--------+---------+
  37. 2 rows in set (0.00 sec)
  38.  
  39. mysql> #intentamos insertar un registro existente
  40. mysql> INSERT INTO nombres_y_especies VALUES ('animal', 'gallina');
  41. ERROR 1062 (23000): Duplicate entry 'animal-gallina' for key 'PRIMARY'
  42.  
  43. mysql> #intentamos insertar un valor que no exista en la tabla nombres
  44. mysql> INSERT INTO nombres_y_especies VALUES ('otro', 'gallina');
  45. ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint
  46. fails (`pruebas`.`nombres_y_especies`, CONSTRAINT `nombres_y_especies_ibfk_1`
  47. FOREIGN KEY (`nombre`) REFERENCES `nombres` (`nombre`) ON DELETE CASCADE)
  48.  
  49. mysql> #intentamos insertar un valor que no exista en la tabla especies
  50. mysql> INSERT INTO nombres_y_especies VALUES ('animal', 'otro');
  51. ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint
  52. fails (`pruebas`.`nombres_y_especies`, CONSTRAINT `nombres_y_especies_ibfk_2` FOREIGN KEY
  53. (`especie`) REFERENCES `especies` (`especie`) ON DELETE CASCADE)

Observa que los criterios de integridad de los datos se están respetando, primero evitando duplicados:

Código:
Duplicate entry 'animal-gallina' for key 'PRIMARY'
y los respectivos errores porque los valores no existen en las tablas foráneas:

Código:
FOREIGN KEY (`nombre`) REFERENCES `nombres` (`nombre`)

FOREIGN KEY  (`especie`) REFERENCES `especies` (`especie`)
Dale un vistazo para ver si te sirve.

Saludos.
Leo.
  #3 (permalink)  
Antiguo 17/10/2011, 11:41
 
Fecha de Ingreso: septiembre-2008
Mensajes: 18
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Evitar registro duplicado en tabla de BD relacional

Uhhhh !!! Leo!
Muchas gracias por tu ayuda, realmente has sido tan claro que no me dajaste lugar a consultarte nada jaja!

Ya pude resolver mi problema, de acuerdo a tu ejemplo, yo estaba fallando en asignar primary key a ambos campos en la tercera tabla, ademas de asignar references a los PK.

De nuevo, muchas gracias Leonardo. Abrazos.

Etiquetas: bd, duplicados, registros, relacional, 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 17:23.