不确定这在 MySql 表创建中是否可行,但这是我的场景:
我有一个表“company”,它有很多字段,其中两个是:“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”。
所以这就是我想要实现的目标:我想要对“公司”表进行某种约束,以便在将记录输入“公司”表时,必须将一个值输入到“扇区 ID”列或'sector_other_id' 列,但只能在两个字段之间输入一个值。即:您不能同时在“sector_id”和“sector_other_id”中输入值。
非常感谢任何帮助。
最佳答案
如果重新设计不是一个选项,那么你可以用 mysql 强制执行所需限制的唯一方法(据我所知仍然没有 CHECK
约束)是写 before insert
和 before 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']....);<br/>
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
;从不在两者中)。如果您可以将此逻辑留给应用程序,则可以省略此字段。
关于MySql 不是空复合字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17127604/