2017-03-16 64 views
0

我正在使用postgres并有2个表事务和备份。 我想将事务的数据从事务传输到备份。仅传输与现有表数据具有不同值的行

交易表中会有新的数据行。

如何仅传输与Transaction表中现有数据具有不同值的数据行,因为我不想重复数据行?

只要列中的数据不同,我就会将该行从事务转移到备份。

例如
第1天:事务(20行),备份(20行)[所有事务文件被备份到晚上备份]

第2天:事务(40行),备份(20行) [Transaction中额外的20行可能包含与Transaction中前20行相同的重复行。我只是想非重复的行转移到备份]

回答

0

阅读:

这应该对整个行工作。

这里真正的问题是,你不知道发生了什么变化。如果信息是仅追加的,并且我们可以假设它们在最后一次备份时都是可见的,那么我们只需选择在某个时间点之后插入的行。如果这些都不是很好的假设,那么你将会有一个长期的问题。 a_horse_with_no_name上面有一个好的解决方案,假设你的数据是仅追加(所有插入,没有更新),但它不会表现的很好,因为这些表格赌得更大。

你可以考虑,而不是有几个选项:

  1. 一个表的审计触发器将允许您指定列,价值观等方面以及当他们被改变,它可以这样做实时的。那将是我的第一个解决方案。

  2. 即使只是插入,您可能想要将信息存储在关于max id等的备份表中,并且在检查时只返回一个备份。然后,您可以使用a_horse_with_no_name的解决方案作为模板。

0

如果我理解你正确地要从交易表将数据复制到备份表。

这样的事情应该这样做。由于您没有向我们展示实际的表格定义,我不得不为列使用虚拟名称。 pk_col是表格的主键列。

insert into backup (pk_col, col1, col2, col3, col4) 
select t.* 
from transactions t 
    full outer join backup b on t.pk_col = b.pk_col 
where t is distinct from b; 

这假设目标表没有唯一键。如果是这样,您需要使用ON CONFLICT子句

0

假设您想要将表Source中的行传输到表Result。从你的问题,我明白他们有相同的专栏。

正如您所提到的,您需要的值不同于Source,这些值已经在Result中。

SELECT * FROM [Source] 
WHERE column NOT IN (SELECT column FROM Result) 

它将返回,,新”记录现在,你需要插入:。

INSERT INTO Result 
SELECT * FROM [Source] 
WHERE column NOT IN (SELECT column FROM Result) 
0

试试这个

insert into Backup (fields1, fields2, ......) 
    select fields1, fields2 from Transaction t where your condition by date here and not exists (select * from Backup b where t.fields1 = b.fields1 
     t.fields2 = b.fields2 
     ..................... 
     ) 
0

如有变化事务表会发生这将插入如果您将事务表中的现有行更改为-NULL(也包括在内) - 将插入到备份表中,但您不应在备份表中存在主键,因为您无法插入该行:

重复键值违反唯一约束 “tb_backup_pkey”

意志出来。我认为这是比你知道的一个更难的问题字里行间

insert into backup (col1, col2, col3, col4) 
select t.* from transactions t 
EXCEPT 
select * from backup b