Ver Mensaje Individual
  #2 (permalink)  
Antiguo 14/10/2011, 15:04
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 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.