使用 postgresql 将第三个表与其他两个表链接以在内部具有动态填充数据

Posted

技术标签:

【中文标题】使用 postgresql 将第三个表与其他两个表链接以在内部具有动态填充数据【英文标题】:Linking third table with other two table to have a dynamic populated data inside using postgresql 【发布时间】:2013-06-28 18:06:26 【问题描述】:

我正处于需要在一个表中动态填充数据的阶段,该表使用外键约束与其他两个表相关联。下面是我在 PostgreSQL 中创建的架构/表。

表#1:

application
--------------------------
id | name | size | rate   

表#1“应用程序”的“id”作为“序列”,这也是一个主键,“名称”作为 Varchar,“大小”和“速率”作为整数

表#2:

Create
-------------------------
createId | name | score

同样。 createId 再次是该表的序列号和主键,“name”为 varchar,“score”为整数。

现在,我正在创建第三个表,它应该是上述两个表的映射表,其中包含以下字段-

表#3

app_create
---------------------
app_create_id | id | createId |

在上表中,我再次将 app_create_id 设置为序列和主键以及其他两个字段作为外键,并引用了上表 application(Id) 和 create(createId)。

接下来,当我在表#1 和#2 中插入值时,我的理解是它应该根据我在其他两个表中插入的数据自动将其填充到第三个表#3 中。但是,相反,我得到一个空白表,这意味着表#3(app_create)映射表中没有值。 (插入表#1和2之后)

我希望得到如下所示的输出,例如- application table 和 create table 填充了以下数据-

application
--------------------------
id | name | size | rate    
1  |    xyz  |   2096 | 12                                         
2  |   mno   |  1280  | 34


Create
-------------------------
createId | name | score                                                         
1        | a.b.c | 50       
2       |  m.cpm  |20    

现在,在我将数据插入上表这两个之后,我不确定我的第三个下表会发生什么。我认为一旦我填充上述两个表,它也会以相同的方式填充,因为存在主键和外键关系。

表#3

app_create
----------------------------------
app_create_id | id | createId |                         

我相信它与多对多关系有关,但我不确定我应该如何以一种或任何正确的方式进行相同的操作并获得同样的输出。 如果我做错了什么,请帮助我理解和纠正我,或者指导我应该如何进行以便动态地将数据放入映射表#3中?

【问题讨论】:

除非您自己明确地将数据插入到第三个表中,否则不会发生任何事情。参照完整性是用于在插入子表时检查父行是否存在,而不是为您插入数据。 @peterm:感谢您的回复。您能否建议我如何进行映射以便将数据插入到我的第三个表中。 似乎与您在 dba.SE 上发布的问题基本相同:dba.stackexchange.com/q/45437/7788。请不要在这样的网站上发帖,并且特别是不要在它们之间没有链接,这会浪费大家的时间。 @CraigRinger:很抱歉我是 *** 的新手。我会记住这一点。感谢您的建议! 【参考方案1】:

这确实与多对多关系有关。任何人都无法为您填写表3的原因是因为没有人知道这种关系是什么。因此,您需要自己填写。应用程序如何与创建相关? (什么是创造?)

因此,您需要问自己/老板/同事的问题是:哪些应用程序应该连接到哪些应用程序?

【讨论】:

【参考方案2】:

这不是外键的使用方式。它们告诉 DBMS,一个列列表的值的子行也必须作为另一个列列表的值的子行出现。它们可以与对表更新级联到引用表更新的影响相关联。

通常我们希望用户根据规则/谓词/标准更新具有外键引用的基表,就像任何基表一样,将行放入表中或将它们排除在表外。

您所描述的内容接近于视图。即一个虚拟表,其值是涉及基数或其他视图的表达式的当前值。你必须说出你想要的表达方式。 (它不是基于外键。)但之后 DBMS 会计算出适当的值。

在这里,您可能期望app_create(忽略app_create_id)是其他两个的连接:

create view app_create as
select id, createId
from application JOIN create

(但你没有解释输出应该是什么样子或给出示例输出。)

这不考虑app_create_id。然而,由于加入,(id, createId) 是唯一的。 (在一些可以声明的 SQL DBMS 中。)所以你不需要app_create_id

但是 app_create_id 无论如何都是有问题的。它的价值应该如何确定?它必须是 id 和 create 的函数,也可能是其他函数。相同的值可以在不同的时间识别不同的行吗?两个不同的(id, createId) 对可以在不同的时间使用相同的app_create_id 吗?

【讨论】:

以上是关于使用 postgresql 将第三个表与其他两个表链接以在内部具有动态填充数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel 将两个表与数据透视表连接起来?

在连接三个表时创建的视图,一个表与另一个表相似

postgresql----COPY之表与文件之间的拷贝

Oracle:将两个表与一个公共列加上第二个表中的一个附加列(最新生效日期)连接以选择其他列

hibernate jpa将两个表与另一个表连接起来

Full Join多个表与Union All多个表