5

我正在尝试在表 A 上创建一个约束,以检查表 B 中是否存在一组记录。我可以使用外键,但问题是表 B 中的数据是非唯一的。

有没有办法在不创建触发器的情况下创建这样的约束?

编辑:我无法更改表 B 结构。

4

3 回答 3

6

外键是 1:N 的关系。在约束的引用端只能有一个父记录。这就是为什么我们只能构建引用唯一键的外键约束。

您似乎想要一个 M:N 的约束。这不适合关系模型。也许您需要一个交集表 (AB),它将表 A 中的许多记录与表 B 中的许多记录联系起来?实际上,可能有几种不同的建模解决方案,具体取决于您的实际需求。

触发器不起作用,部分原因是它们无法扩展,但主要是因为它们无法在多用户环境中工作。

于 2012-11-05T13:29:43.563 回答
5

一种技术是使用物化视图(提交时快速刷新)来存储被引用列的唯一值,并约束你的表。

由于读取一致性或锁定问题,尝试使用触发器来强制执行完整性通常注定要失败。

于 2012-11-05T13:30:13.590 回答
0

我很确定强制执行这种关系的唯一方法是使用触发器。

正如您所提到的,表 B 中的数据是非唯一的,因此外键不起作用。(另请参阅外键可以引用非唯一索引吗?

我想到了检查约束,但它们在这里不起作用,因为:

  1. 不得引用其他表
  2. 不能包含子查询。

话虽如此,表 B 中的数据不是唯一的原因可能是它没有被规范化。可能值得查看您的模式,看看您是否可以提取 A 和 B 之间的唯一关系,可能使用中间表。

于 2012-11-05T13:29:28.523 回答