非唯一索引上的外键? (Oracle)的

时间:2012-11-05 13:20:46

标签: sql oracle database-design constraints data-modeling

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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

如您所述,表B中的数据是非唯一的,因此外键不起作用。 (另见Can a foreign key reference a non-unique index?

检查约束会浮现在脑海中,但它们在这里不起作用,因为:

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

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