很简单的例子:
一个公司可以有n个地点,其中一个地点是主地点。我们能用mysql外键解决这个问题吗?
我们目前的方法是在每个位置有一个指向company的指针(company\u id)和一个指向company中位置的指针(main\u location\u id)。
假设我们不允许空引用,这种方法显然是错误的,因为它禁止创建:您不能创建一个公司,因为它没有主位置\u id,您不能创建一个位置,因为if没有公司\u id。由于验证仍然在事务的每个步骤中运行,事务没有帮助。
有什么想法吗?
谢谢!
编辑1
有些人建议在位置或中间表中使用带有唯一索引的标志来解决这个问题。我们已经考虑过它,但它有一个主要问题:它增加了开销,因为添加一个新的主位置将需要遍历所有其他位置以将它们的标志设置为false。
编辑2
我们的首选解决方案(在理想情况下)是在事务结束时检查验证,而不是在每个步骤中。这可以通过禁用外键检查来实现,正如在注解中提出的那样,但这当然是一个次优的解决方案。
结论:
如果不放松其中一个约束条件,mysql就无法做到这一点。我们将使用before insert签入公司来检查位置引用是否不为空。
尽管如此,我仍然很好奇为什么mysql不允许在事务结束时传递验证,而不是在每一步都进行验证。
1条答案
按热度按时间ohtdti5x1#
你必须有三张table。
第一,你的
Company
表,其中包含有关公司的标量信息(如名称、会计代码等)第二,一张table
Location
没有你公司的链接。在此表中,即,您的行为:特拉法加广场
翁贝托街
等等
第三张,中间的table,
CompanyLocation
,其中有一个双外键,companyid和locationid,第三列由标志表示(isprimary)这就是全部