我正在尝试在表 A 上创建一个约束,以检查表 B 中是否存在一组记录。我可以使用外键,但问题是表 B 中的数据是非唯一的。
有没有办法在不创建触发器的情况下创建这样的约束?
编辑:我无法更改表 B 结构。
我正在尝试在表 A 上创建一个约束,以检查表 B 中是否存在一组记录。我可以使用外键,但问题是表 B 中的数据是非唯一的。
有没有办法在不创建触发器的情况下创建这样的约束?
编辑:我无法更改表 B 结构。
外键是 1:N 的关系。在约束的引用端只能有一个父记录。这就是为什么我们只能构建引用唯一键的外键约束。
您似乎想要一个 M:N 的约束。这不适合关系模型。也许您需要一个交集表 (AB),它将表 A 中的许多记录与表 B 中的许多记录联系起来?实际上,可能有几种不同的建模解决方案,具体取决于您的实际需求。
触发器不起作用,部分原因是它们无法扩展,但主要是因为它们无法在多用户环境中工作。
一种技术是使用物化视图(提交时快速刷新)来存储被引用列的唯一值,并约束你的表。
由于读取一致性或锁定问题,尝试使用触发器来强制执行完整性通常注定要失败。
我很确定强制执行这种关系的唯一方法是使用触发器。
正如您所提到的,表 B 中的数据是非唯一的,因此外键不起作用。(另请参阅外键可以引用非唯一索引吗?)
我想到了检查约束,但它们在这里不起作用,因为:
话虽如此,表 B 中的数据不是唯一的原因可能是它没有被规范化。可能值得查看您的模式,看看您是否可以提取 A 和 B 之间的唯一关系,可能使用中间表。