MySql 不是空复合字段

标签 mysql

不确定这在 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 insertbefore 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 个表中(sectorother_sector ;从不在两者中)。如果您可以将此逻辑留给应用程序,则可以省略此字段。

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

相关文章:

php - 在单个 FreeBSD 主机上安装多个版本的 Apache、PHP 和 MySQL 的最佳方法

mysql - 添加MySQL约束,即某个字段作为同一个表的主键存在

php - 在 Laravel/Eloquent 中查询多个嵌套关系

javascript - 第二次单击时取消选中单选按钮

mysql - 为什么 Google Cloud SQL 中的 COUNT 有时这么慢?

PHP 基本搜索引擎

mysql - 获取不包含 X 成分的食谱

php - mysql 查询中的 Concat()

php - MySQL INDEX Varchar Field 500 for urls

PHP实时动态计算mysql结果之和