【问题标题】:Foreign key on table A --> B, AND foreign key on table B --> A. How is this done?表 A 上的外键 --> B,以及表 B 上的外键 --> A。这是如何完成的?
【发布时间】:2011-02-22 07:15:41
【问题描述】:

我有两个表 - 'business' 和 'business_contacts'。

business_contact 表与business 表是多对一的关系。此外,每个企业都有一个“主要联系人”字段 - 我假设它与 business_contacts 表是一对多的关系。

当然,问题在于这会为数据插入创建一个 catch-22。由于两个字段都不能为空,所以在我有对应的业务之前,我无法插入business_contact,但在我有对应的business_contact 之前,我无法插入业务。

如果有人能帮助我了解应该如何处理相互的一对多关系,我将不胜感激。

(如果有什么不同,项目正在 MySQL 中完成)

【问题讨论】:

    标签: mysql schema database


    【解决方案1】:

    您只想创建一个引用 business 表的主键的外键

    一个好主意可能是将您的主要联系人直接放在您的业务表中,并使您的 business_contacts 表只包含“次要联系人”

    伪代码:

    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 );
    

    【讨论】:

      【解决方案2】:

      你能让“主要联系人”为空吗? 然后您可以插入一个企业,然后是一个 business_contact,然后您可以设置“主要联系人”字段。

      您也可以使用 MySQL(但我不建议这样做。):

      /*!40014 SET FOREIGN_KEY_CHECKS=0 */;
      
      ... your statements ...
      
      /*!40014 SET FOREIGN_KEY_CHECKS=1 */;
      

      【讨论】:

        【解决方案3】:

        您可以从业务表中删除“主要联系人”并将其移至 business_contact 表:

         business
          - business_id
          - name
          - address
          - blah
        
         business_contact
          - business_contact_id
          - business_id
          - is_primary_contact (bit field)
        

        因此,确定企业的主要联系人变成:

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

        【讨论】:

        • 嗨 Ant,感谢您的回复 - 我想这可能是我必须做的。我需要放置一个 is_primary_Contact 和 business_id 的唯一索引以确保只有一个主索引,但它应该可以完成工作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 1970-01-01
        • 2013-10-07
        相关资源
        最近更新 更多