MySql非空复合字段

MySql非空复合字段,mysql,Mysql,不确定这在MySql表创建中是否可行,但这是我的场景: 我有一个表“company”,它有许多字段,其中两个是:“section\u id”和“section\u other\u id” 我还有另外两张表:“扇区”和“扇区其他” “扇区”有两个字段:“id”和“名称” “sectorOther”有两个相同的字段:“id”和“name” “行业”大约有二十个行业,如“娱乐”、“科技”等。。。 “sectorOther”是一个包含其他部门名称的表,当“部门”表中的条目不能充分定义其特定公司的部门时,

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

我有一个表“company”,它有许多字段,其中两个是:“section\u id”和“section\u other\u id”

我还有另外两张表:“扇区”和“扇区其他”

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

“行业”大约有二十个行业,如“娱乐”、“科技”等。。。 “sectorOther”是一个包含其他部门名称的表,当“部门”表中的条目不能充分定义其特定公司的部门时,使用我的应用程序的用户可以通过文本框输入其他部门名称

在“公司”表中,“部门id”是引用“部门”表中“id”的FK “sector_other_id”是引用“sector_other”表中的“id”的FK

这就是我想要实现的:我想要对“company”表进行某种约束,以便在“company”表中输入记录时,必须在“sector_id”列或“sector_other_id”列中输入一个值,但在两个字段之间只能输入一个值。i、 e.:不能在“扇区id”和“扇区其他id”中同时输入值


非常感谢您的帮助。

如果重新设计不是一个选项,那么您可以使用mysql强制执行所需的限制的唯一方法(据我所知,仍然没有
检查
约束)是在插入之前编写
,在更新之前编写
触发器,如果这两个字段都不为空,则会引发错误

更新。 您可以重构您的表,为
扇区
其他扇区
表使用“公共父级”,从而消除了
公司
中对独占弧的需要(可能还有其他表)

简单地说,您可以创建一个新表,例如
抽象扇区(抽象扇区id,抽象扇区类型[枚举,扇区或其他扇区])
。 然后制作此表的旧表详细信息:
扇区(抽象扇区id,抽象扇区类型[枚举,始终为“其他扇区”]…)
其他扇区(抽象扇区id,抽象扇区类型[枚举,始终为“其他扇区”],…)

现在,
company
不需要两个字段,只需要一个(
abstract\u sector\u id
)。
关于
抽象扇区类型的说明
。该字段似乎是多余的,因为
abstract\u sector\u id
本身是唯一的,类型字段的原因是强制特定的抽象扇区准确存储在一个表中(要么
sector
要么
other\u sector
,两者都不能)。如果您同意将此逻辑留给应用程序,则可以省略此字段

实际上,我还没有创建数据库或表。我把设计写在纸上了。除了“部门”部分外,所有表和关系看起来都很好。设计如下:续。。。一个“部门/其他”表“扇区”表将包含预定义的扇区名称,而“扇区_其他”则存在,因此当成员在应用程序的“其他”txtbox中键入新扇区时,它将存储在“扇区_其他”表中。所以在“memberCompany”表中,有两个字段:“sector\u id”和“sector\u other\u id”。这些字段中只有一个可以有记录的值,但必须有一个。i、 e:成员公司必须定义其部门,但只能是“部门”表或“部门/其他”表中的一个部门。我知道这不是完美的设计。有什么建议吗?我上面的第一条评论不知怎么被截断了。所以不管怎样,这里有一个“会员公司”。每个公司都必须定义自己的部门。会员可以从预定义的扇区列表中进行选择,或通过应用程序中的txtbox输入扇区。如果他们使用后者,我必须将其存储在某个地方,因此我考虑为此创建一个“sector_other”表。有关设计说明的其余部分,请参见我之前的评论…@user2489551:检查更新的答案,并提供重新设计建议谢谢您的建议。我想有几种方法可以在表设计中实现这一点。最后,我只创建了一个表:“扇区”,其中包含3个字段:“id”、“扇区类型”(枚举:“扇区”、“扇区其他”)、“名称”。所以我使用了您使用枚举的想法,但只是为了区分管理员添加的标准扇区和应用程序用户添加的扇区。当然,应用程序本身还有进一步的业务逻辑来处理用户输入的部门名称,但那是另一回事。谢谢你的建议;这肯定对我有帮助。