Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库中主要同步的两个或多个表_Sql_Database_Postgresql_Database Replication - Fatal编程技术网

Sql 数据库中主要同步的两个或多个表

Sql 数据库中主要同步的两个或多个表,sql,database,postgresql,database-replication,Sql,Database,Postgresql,Database Replication,我使用的是PostgreSQL,我需要有两个或多个表,这些表在我的数据库中大部分是同步的,这样子表中的一行的添加/删除/更新就会被添加到主表中 我不确定在这种情况下是否可以使用触发器,因为在我的情况下,子表可能会被截断并加载新的数据集 你知道如何实现吗 例如: Employee_Sub1: id name version +------+-------+--------+ 101 John 1 102 David 1 105 Azi

我使用的是PostgreSQL,我需要有两个或多个表,这些表在我的数据库中大部分是同步的,这样子表中的一行的
添加/删除/更新
就会被添加到主表中


我不确定在这种情况下是否可以使用触发器,因为在我的情况下,子表可能会被截断并加载新的数据集

你知道如何实现吗

例如:

Employee_Sub1:
 id    name    version
+------+-------+--------+
 101    John     1
 102    David    1
 105    Azi      1

Employee_Sub2:
 id    name    version
+------+-------+--------+
 101    John     1
 102    DavidX   2       <- Sub2 having updated value for id 102
 105    Azi      1
 107    Marry    1

Employee_Sub3:
 id    name    version
+------+-------+--------+
 101    John    1
 105    Azi     1
 110    devil   1       <- Sub3 having new row of data

我想你在寻找;有关如何在PL/PgSQL中实现它们的信息,请参见。在插入、更新或删除
触发器后,使用
Employee_Sub1
Employee_Sub2
Employee_Sub3
将其更改传播到
Employee_Final

对这个问题也有一点感觉,但我不确定继承是否合适


通常,当您更改ID时,您会在更新级联上使用
外键引用,但这在这里不起作用,因为您需要反转它,当您更改FK时,PK会得到更新。这是另一个触发工作;您必须比较
新的
旧的
记录ID,并在ID发生更改时更新主表。

通常在源表上创建一个触发器,它会确定是否更新或插入目标表。

您可以使用表继承。首先,创建没有数据的主表,然后使用继承选项从主表创建子表。当您从主表中选择时,resultset包含子表的数据集。Visit

一种可能是将主表创建为视图,并将实际数据仅包含在子表中。但是,这意味着每次访问数据时都会运行用于创建视图的查询,因此,如果查询是重连接并且持续运行,这可能是不可伸缩的。我不确定在这种情况下是否可以使用触发器,因为在我的情况下,子表可能会被截断并加载新的数据集。抱歉,没有在问题的前面突出显示。没有触发器有什么可能吗?@Azi您可以使用TRUCATE上的
触发器来应对这种情况。否则,按照@Edu的建议,将主表设置为视图。感谢您的回复。顺便说一句,表继承看起来像并集,id字段即使设置为主键也会重复。表继承中删除行是如何处理的?没有继承PK。数据修改发生在子表中,因此当您从主表中选择时,它仅从所有子表中选择数据。如果您希望在所有子表中处理ID,则可以使用单个序列,以便每个子表共享ID列的序列。就像。。。。创建表选项卡\u名称(列\u名称varchar(1)默认nextval('sequence\u name'))
Employee_Final:
 id    name    version
+------+-------+--------+
 101    John    1
 102    DavidX  2
 105    Azi     1
 107    Marry   1
 110    devil   1