【问题标题】:Foreign key on a non-unique index? (oracle)非唯一索引上的外键? (甲骨文)
【发布时间】:2012-10-25 08:12:29
【问题描述】:

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

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

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

【问题讨论】:

  • 这不是 SQL 标准...外键必须指向唯一记录,通过引用父表上的主键或唯一键...
  • 您的模型中似乎缺少一个表(主键为该列的表)

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复。我添加了一条注释,说明我无法更改表 B 结构。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 2016-01-15
      相关资源
      最近更新 更多