Sql 非唯一索引上的外键?(甲骨文)

Sql 非唯一索引上的外键?(甲骨文),sql,oracle,database-design,constraints,data-modeling,Sql,Oracle,Database Design,Constraints,Data Modeling,我试图在表a上创建一个约束,以检查表B中是否存在一组记录。我可以使用外键,但问题是表B中的数据是非唯一的 有没有办法在不创建触发器的情况下创建这样的约束 编辑:我无法更改表B的结构。我非常确定,强制执行这种关系的唯一方法是使用触发器 正如您所提到的,表B中的数据是非唯一的,因此外键不起作用。(另见) 我想到了检查约束,但它们在这里不起作用,因为: 不得引用其他表 不能包含子查询 也就是说,表B中的数据不唯一的原因可能是它没有标准化。可能需要检查模式,看看是否可以提取a和B之间的唯一关系,可能需

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

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


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

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

正如您所提到的,表B中的数据是非唯一的,因此外键不起作用。(另见)

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

  • 不得引用其他表
  • 不能包含子查询


  • 也就是说,表B中的数据不唯一的原因可能是它没有标准化。可能需要检查模式,看看是否可以提取a和B之间的唯一关系,可能需要使用中间表。

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

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


    触发器不起作用,部分原因是它们不可伸缩,但主要原因是它们在多用户环境中不起作用。

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


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

    这不是SQL标准。。。通过在父表上指定主键或唯一键,外键必须指向唯一记录…您的模型中似乎缺少一个表(主键为该列的表)。谢谢您的回复。我添加了一条注释,解释我不能更改表B的结构。