不确定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'中输入值。
非常感谢任何帮助。
答案 0 :(得分:0)
如果重新设计不是一个选项,那么你可以用mysql强制实现所需限制的唯一方法(据我所知仍然没有CHECK
约束)是写before insert
和before update
个触发器如果这两个字段都不为空,则抛出错误...
<强>更新强>
您可以重构表,以便为sector
和other_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个表中(sector
或other_sector
;从不都)。如果您可以将此逻辑留给应用程序,则可以省略此字段。