2010-05-21 15 views
5

Tengo dos tablas: 'business' y 'business_contacts'.Clave externa en la tabla A -> B, y clave externa en la tabla B -> A. ¿Cómo se hace esto?

La tabla business_contact tiene una relación muchos a uno con la tabla de negocios. Además, cada empresa tiene un campo de "contacto primario", que supongo que es una relación uno a muchos con la tabla business_contacts.

El problema, por supuesto, es que esto crea un catch-22 para la inserción de datos. Como ninguno de los campos puede ser nulo, no puedo insertar un business_contact hasta que tenga un negocio correspondiente, pero no puedo insertar un negocio hasta que tenga un business_contact correspondiente.

Si alguien me puede ayudar a entender cómo se deben tratar las relaciones mutuas uno a otro, estaría muy agradecido.

(Proyecto está haciendo en MySQL si hace alguna diferencia)

Respuesta

2

usted podría quitar el "contacto primario" de la tabla de negocios y moverlo a la mesa business_contact lugar:

business 
    - business_id 
    - name 
    - address 
    - blah 

business_contact 
    - business_contact_id 
    - business_id 
    - is_primary_contact (bit field) 

Determinar el contacto principal para que una empresa se convierte así en:

SELECT * FROM business_contact 
WHERE business_id = <somevalue> AND is_primary_contact = 1 
+0

Hola Hormiga, Gracias por la respuesta. Creo que esto es probablemente lo que tendré que hacer. Necesitaré poner un índice único de is_primary_Contact & business_id para asegurar solo un primario, pero debería hacer el trabajo. – PlankTon

0

sólo desea crear una clave externa que hace referencia la clave primaria de la tabla business

una buena idea es, probablemente, tener su contacto principal directamente en su mesa de negocios y hacer su mesa business_contacts simplemente mantener "contactos secundarios"

seudo código:

table business (id PRIMARY KEY, col1, col2, col3, zip, street, country); 
table business_contacts (contact_id PRIMARY KEY, business_id FOREIGN KEY REFERENCES business.id, 
    zip, street, country); 
0

¿Puede hacer que el "contacto primario" se pueda anular? Luego puede insertar un negocio, luego un contacto_business y luego puede establecer el campo 'contacto primario'.

alternativa para MySQL que puede hacer (Pero yo no lo recomendaría.):

/*!40014 SET FOREIGN_KEY_CHECKS=0 */; 

... your statements ... 

/*!40014 SET FOREIGN_KEY_CHECKS=1 */; 
Cuestiones relacionadas