【发布时间】:2021-07-28 19:27:14
【问题描述】:
我有这个表结构和简单的关系:
以及表中的样本数据:
公司
公司名称是唯一的,不应重复:
+------------+---------------+
| Company_ID | Company_name |
+------------+---------------+
| 1 | Company_name1 |
+------------+---------------+
| 2 | Company_name2 |
+------------+---------------+
位置 (位置应分配给特定的公司):
+-------------+------------+-------------------------+
| Location_ID | Company_ID | Location_name |
+-------------+------------+-------------------------+
| 1 | 1 | Company1_Location_name1 |
+-------------+------------+-------------------------+
| 2 | 1 | Company1_Location_name2 |
+-------------+------------+-------------------------+
| 3 | 2 | Company2_Location_name1 |
+-------------+------------+-------------------------+
| 4 | 2 | Company2_Location_name2 |
+-------------+------------+-------------------------+
数据 表中的数据应取决于所选公司,位置应仅是公司中出现的位置:
+---------+-------------+------------+------------+------+
| Data_ID | Location_ID | Company_ID | data_value | date |
+---------+-------------+------------+------------+------+
| 1 | 1 | 1 | 5 | date |
+---------+-------------+------------+------------+------+
| 2 | 2 | 1 | 2 | date |
+---------+-------------+------------+------------+------+
| 3 | 3 | 2 | 3 | date |
+---------+-------------+------------+------------+------+
| 4 | 2 | 1 | 1 | date |
+---------+-------------+------------+------------+------+
| 5 | 4 | 2 | 6 | date |
+---------+-------------+------------+------------+------+
| 6 | 4 | 2 | 7 | date |
+---------+-------------+------------+------------+------+
应满足的主要依赖关系:
- 公司名称应该是唯一的,并且应该阻止添加同一公司的尝试
- 位置名称应分配给特定公司,但它们可能会重复,并且位置可能出现在多个公司中但具有不同的
Location_ID - 向日期表添加值应取决于:
- 公司(我们选择为其增值的特定公司)
- 地点(地点必须取决于公司)
例如:
在为具有Company_ID = 1 的公司添加值时,我应该只能添加出现在该公司下的Location_ID。
如果我想在Company_name1 表中为Company_name1 添加一个值,那么data 表中Location_ID 列的唯一可用值应该是:Company1_Location_name1 和Company1_Location_name2,我不能那里有另一家公司的价值(即Company2_Location_name1 和Company2_Location_name2)
目前效果不佳:
向data 表添加值时,我可以选择一家公司,但我有可用的位置,我可以添加没有意义的值 - 对于Company_name1,我可以从Company_name2 添加一个位置,但它应该被阻止.
我该如何解决这样的问题?添加一些负责特定配对的附加表?
【问题讨论】:
-
是否可以有没有位置的数据?如果不是,则 location 表示公司,您应该从数据表中删除 Company_ID。此外,这听起来像是用户界面问题,而不是直接与 mysql 相关。
-
您不能将此关系指定为自动约束,因为
CHECK约束中不允许子查询。你可以用触发器来做到这一点。 -
@JoelCoehoorn 一切正常,但关键是将值添加到表
data的人尽可能简单,在这种情况下,只有位置名称可能会重复,然后我不知道该数据将添加到哪个公司 -
@Barmar 任何示例我如何在 mariadb 下做到这一点?
标签: mysql sql mariadb foreign-keys relationship