我正在使用 MySQL5.5,对于这个问题,我有 3 个简单的表 t1、t2 和 t3,设计如下:
+------------+ +------------+ +------------+
| t1 | | t2 | | t3 |
+------------+ +------------+ +------------+
| t1_id (PK) | | t2_id (PK) | | t3_id (PK) |
+------------+ | some_value | | t1_id (FK) |
+------------+ | t2_id (FK) |
+------------+
PK=主键,FK=外键,所有字段都是INT类型
我遇到的问题是我想向涉及该字段的表 t3 添加一个约束t2.some_value
。基本上我希望 和 的组合t1.t1_id
在t2.some_value
表 t3 中是唯一的。例如,这是我想避免的情况:
t1 t2 t3
+-------+ +-------+------------+ +-------+-------+-------+
| t1_id | | t2_id | some_value | | t3_id | t1_id | t2_id |
+-------+ +-------+------------+ +-------+-------+-------+
| 10 | | 20 | 1 | | 30 | 10 | 20 | <-- t2.some_value = 1
| 11 | | 21 | 2 | | 31 | 10 | 21 |
+-------+ | 22 | 3 | | 32 | 10 | 22 |
| 23 | 1 | | 33 | 10 | 23 | <-- t2.some_value = 1
+-------+------------+ | 34 | 11 | 23 |
+-------+-------+-------+
这里的问题是 t3 中的两个记录将相同的 t1 记录 (t1_id=10) 链接到具有相同some_value
. 有什么办法可以防止这种情况发生吗?据我所知,MySql 不允许定义跨多个表的约束。
我可以想到一种解决方案,但这涉及复制some_value
表 t3 中的字段,因此我可以直接在其上强制执行唯一键。这显然违反了归一化设计规则,但有没有其他办法呢?
据我所知,您必须在表 3 中创建“some_value”。这是外键约束手册页的链接
有一个与您的设置类似的“复杂”外键约束示例,它复制了第三个表中的内容。知道嘿,至少它是由外键处理的(最小)安慰。