在 t-sql 中,如何在单个 table 的列之间创建一对一关系?
In t-sql how do I create a one to one relationship between the columns of a single table?
我有一个包含 C1、C2、C3 和 C4 列的 table。一个值可以在 C1 中出现多次,但对于 C1 的每个值,列 C3 和 C4 的组合必须具有唯一值。类似地,一个值可以出现在 C3 和 C4 中的多行中,但对于 C3 和 C4 中值的任何特定组合,C1 中必须有一个唯一值。主键是 C1+C2+C3+C4。例如:
- C1 | C2 | C3 | C4 |评论
- 11 ! 20 | 31 | 41 |任何时候 C1=11,必须有 C3=31 和 C4=41,反之亦然
- 11 ! 21 | 31 | 41 |好的,因为 C2 不同
- 11 ! 22 | 32 | 41 |不好,因为 C1=11 但 C3<>31
- 11 ! 22 | 31 | 42 |不好,因为 C1=11 但 C4<>41
- 12 ! 23 | 31 | 41 |不好,因为 C1<>11 但 C3=31 且 C4=41
- 13 个! 21 | 31 | 42 |任何时候 C1=12,必须有 C3=31 和 C4=42,反之亦然
-
创建一些具有允许组合的 table 并使用外键
也就是说,您将有一个 table 如下
C1, C3, C4
11, 31, 41
12, 31, 42
然后在 C1、C3 和 C4 上的第一个 table 上添加一个外键
基于 gbn 的建议(或使其明确)。事实上,一个特定的映射可以在原始 table 中出现不止一次(例如,第 1 行和第 2 行对于 C1、C3 和 C4 具有相同的值)使事情变得困难。使用第二个 table 和第一个 table 的外键,以便每个映射在第二个 table 中只出现一次。然后,诀窍是,在第二个 table 中,对 C1 有一个 UNIQUE 约束,对 (C3,C4) 有一个单独的 UNIQUE 约束。由于地图每一侧的每个值在第二个 table 中只能出现一次,因此您强制执行了 1-1 映射。
我有一个包含 C1、C2、C3 和 C4 列的 table。一个值可以在 C1 中出现多次,但对于 C1 的每个值,列 C3 和 C4 的组合必须具有唯一值。类似地,一个值可以出现在 C3 和 C4 中的多行中,但对于 C3 和 C4 中值的任何特定组合,C1 中必须有一个唯一值。主键是 C1+C2+C3+C4。例如:
- C1 | C2 | C3 | C4 |评论
- 11 ! 20 | 31 | 41 |任何时候 C1=11,必须有 C3=31 和 C4=41,反之亦然
- 11 ! 21 | 31 | 41 |好的,因为 C2 不同
- 11 ! 22 | 32 | 41 |不好,因为 C1=11 但 C3<>31
- 11 ! 22 | 31 | 42 |不好,因为 C1=11 但 C4<>41
- 12 ! 23 | 31 | 41 |不好,因为 C1<>11 但 C3=31 且 C4=41
- 13 个! 21 | 31 | 42 |任何时候 C1=12,必须有 C3=31 和 C4=42,反之亦然 -
创建一些具有允许组合的 table 并使用外键
也就是说,您将有一个 table 如下
C1, C3, C4
11, 31, 41
12, 31, 42
然后在 C1、C3 和 C4 上的第一个 table 上添加一个外键
基于 gbn 的建议(或使其明确)。事实上,一个特定的映射可以在原始 table 中出现不止一次(例如,第 1 行和第 2 行对于 C1、C3 和 C4 具有相同的值)使事情变得困难。使用第二个 table 和第一个 table 的外键,以便每个映射在第二个 table 中只出现一次。然后,诀窍是,在第二个 table 中,对 C1 有一个 UNIQUE 约束,对 (C3,C4) 有一个单独的 UNIQUE 约束。由于地图每一侧的每个值在第二个 table 中只能出现一次,因此您强制执行了 1-1 映射。