引用另一个模式的外键

Posted

技术标签:

【中文标题】引用另一个模式的外键【英文标题】:Referencing the foreign key of another schema 【发布时间】:2015-03-19 21:05:50 【问题描述】:

对于我的项目,我使用的是 oracle 数据库,我必须使用 2 个不同的数据库模式。请考虑以下情况 -

我有一个架构A,其中我有一个表table_a,主键apk

我还有另一个架构B,其中我有一个表table_b,主键bpk

如果这两个表都在同一个数据库中,那么我可以轻松地建立主键-外键关系。

但是我可以在这两列之间创建一个主键 - 外键关系(或类似的东西) - A.table_a.apkB.table_b.pbk

提前致谢。

【问题讨论】:

如果您使用 Oracle 意义上的“数据库”,不,您不能创建引用远程数据库中的表的外键。如果您在同一个数据库中确实有两个不同的架构(AB),那么您可以创建一个外键。 数据库不应该像那样相互通信。如果您希望它们进行通信,为什么会有两个不同的数据库? @Justine Cave,我使用的是单个数据库。这里没有远程数据库,我有两个不同的模式。我将编辑问题。谢谢 【参考方案1】:

要创建引用不同架构中对象的外键,您只需限定对象名称

ALTER TABLE B.table_b
  ADD CONSTRAINT fk_b_a FOREIGN KEY (apk) REFERENCES a.table_a( apk )

这也要求用户BA.table_a 有足够的权限。用户需要拥有REFERENCES 权限,并且可能还需要拥有该表的SELECT 权限。

【讨论】:

非常感谢。我会试试这个。 在 A.table_a 上有哪些足够的权限?响应:“将 A.table_a 上的引用授予 B”; 如果架构不是提前知道的,但是是“动态的”,例如它位于table_b的列上? @EgeErsoz - 我不确定我是否跟随。如果您在定义子表时不知道哪个模式具有它需要引用的父表,那么您将无法创建约束(并且您的数据模型非常有问题)。这就是你要问的吗?还是你在问别的? 在公共架构下,我有table_a,其中包含两列:invoice_idschema_name。我想告诉 Postgres invoice_id 指的是 schema_name.invoices,其中 schema_name 是该行中的列值。这有意义吗?

以上是关于引用另一个模式的外键的主要内容,如果未能解决你的问题,请参考以下文章

SQL 2005 另一个基础之间的外键

在Django中从一个应用程序到另一个应用程序的外键

如何使用laravel中另一个表中的外键获取所需的列

非主键的外键

Mysql的外键

可以保存重复值的外键