不知道在MySql表创建中是否可行,但这是我的情况:

我有一个表“ company”,其中有许多字段,其中两个是:“ sector_id”和“ sector_other_id”

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

“扇区”具有两个字段:“标识”和“名称”
'sectorOther'具有相同的两个字段:'id'和'name'

“部门”有大约20个部门,例如“娱乐”,“技术”等。
“ sectorOther”是一个表,其中包含其他部门名称,当“ sector”表中的条目不足以为其特定公司定义部门时,使用我的应用程序的用户可以通过文本框输入其他部门名称。

在“公司”表中,“ sector_id”是一个在“ sector”表中引用“ id”的FK
“ sector_other_id”是一个FK,在“ sector_other”表中引用了“ id”。

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

任何帮助,不胜感激。

最佳答案

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

更新。
您可以将表重构为对sectorother_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;从不在两个表中)。如果可以将逻辑保留给应用程序,则可以省略此字段。

关于mysql - MySQL不能为空复合字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17127604/

10-16 22:57