MySql不是null复合字段

时间:2013-06-15 20:28:37

标签: mysql

不确定MySql表创建是否可行,但这是我的方案:

我有一个表'公司',其中有许多字段,其中两个是:'sector_id'和'sector_other_id'

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

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

'sector'有二十个左右的行业,如“娱乐”,“技术”等...... 'sectorOther'是一个包含其他扇区名称的表,当'sector'表中的条目没有充分定义其特定公司的扇区时,使用我的应用程序的用户可以通过文本框输入。

在'company'表中,'sector_id'是一个FK,引用'sector'表中的'id' 'sector_other_id'是一个FK,引用'sector_other'表中的'id'。

所以这就是我想要实现的目标:我希望在'company'表上有某种约束,这样当记录输入'company'表时,必须在'sector_id'列中输入一个值或'sector_other_id'列,但只能在两个字段之间输入一个值。即:您不能在'sector_id'和'sector_other_id'中输入值。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

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

<强>更新 您可以重构表,以便为sectorother_sector表使用“common parent”,从而消除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;从不都)。如果您可以将此逻辑留给应用程序,则可以省略此字段。