1

不确定这在 MySql 表创建中是否可行,但这是我的场景:

我有一个表 'company' 有很多字段,其中两个是:'sector_id' 和 'sector_other_id'

我还有另外两个表:'sector' 和 'sectorOther'

'sector' 有两个字段:'id' 和 'name' 'sectorOther' 有相同的两个字段:'id' 和 'name'

'sector' 有 20 个左右的部门,例如“娱乐”、“技术”等。“sectorOther”是一个包含其他部门名称的表格,使用我的应用程序的用户可以在“部门”表没有充分定义其特定公司的部门。

在“company”表中,“sector_id”是引用“sector”表中的“id”的 FK,“sector_other_id”是引用“sector_other”表中的“id”的 FK。

所以这就是我想要实现的目标:我想要对“公司”表进行某种约束,以便在将记录输入“公司”表时,必须在“扇区 ID”列或“扇区其他 ID”列中输入一个值' 列,但在两个字段之间只能输入一个值。即:您不能在“sector_id”和“sector_other_id”中输入值。

非常感谢任何帮助。

4

1 回答 1

0

如果重新设计不是一个选项,那么您可以使用 mysql 强制执行所需限制的唯一方法(CHECK据我所知仍然没有约束)是编写before insertbefore update触发如果这两个字段都不为空则引发错误......

更新。 您可以重构您的表以对表使用“公共父级”,sector从而other_sector消除对company(可能还有其他表)中排他弧的需要。

简而言之,您创建一个新表,例如 abstract_sector(abstract_sector_id, abstract_sector_type[enum, either 'sector' or 'other_sector'])。然后制作该表的旧表详细信息:
sector(abstract_sector_id,abstract_sector_type [enum,always 'other sector']....);
other_sector(abstract_sector_id,abstract_sector_type[enum,always 'other other_sector'],...);

现在company不需要 2 个字段,而只需要一个 ( abstract_sector_id)。关于abstract_sector_type. 该字段似乎是多余的,因为abstract_sector_id它本身是唯一的,类型字段的原因是强制将特定的抽象扇区精确地存储在 1 个表中(要么sectorother_sector;从不在两者中)。如果您可以将此逻辑留给应用程序,则可以省略此字段。

于 2013-06-15T20:32:52.960 回答