2012-11-05 98 views
3

我想在表A上创建一个约束来检查表B中是否存在一组记录。我可以使用一个外键,但问题是表B中的数据是非实际的,独特。非唯一索引中的外键? (oracle)

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

编辑:我不能改变表B结构。

+0

它不是SQL标准......外键必须指向唯一记录,方法是引用父表上的主键或唯一键... –

+1

看起来您缺少模型中的表(主键将成为此列的表) –

回答

3

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

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

0

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

正如你所说,表B中的数据是非唯一的,所以外键不起作用。 (也Can a foreign key reference a non-unique index?见)

CHECK约束浮现在脑海中,但因为他们不会在这里工作:

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

这就是说,有可能是,在表B中的数据不是唯一的原因是,它是不被标准化。可能值得检查一下您的模式,看看是否可以使用中间表提取A和B之间的唯一关系。

4

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

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

触发器不起作用,部分原因是它们不能达到规模,但主要是因为它们不能在多用户环境中工作。

+0

谢谢您的回复。我添加了一条解释说明我无法更改表B结构的评论。 –