仅传输具有不同值的行作为现有表数据

时间:2017-03-16 07:43:08

标签: sql postgresql

我正在使用postgres并拥有2个表Transaction和Backup。 我想将数据行从Transaction传输到Backup。

Transaction表中会有新的数据行。

如何只传输具有不同值的数据行作为Transaction表中的现有数据,因为我不希望有重复的数据行?

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

e.g
第1天:交易(20行),备份(20行)[所有交易文件备份到晚上备份]

第2天:交易(40行),备份(20行)[事务中的额外20行可能包含重复行,作为事务中的前20行。我只想将非重复行传输到Backup]

5 个答案:

答案 0 :(得分: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子句

答案 1 :(得分: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)

答案 2 :(得分: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
        .....................
        )

答案 3 :(得分:0)

如果在事务表中发生任何更改,则会插入。如果从事务表中更改现有行,则还包括-NULL - 将插入到备份表中。但是你不应该在备份表中使用主键,因为你无法插入该行:

  

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

会出来。

这适用于整行:

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

答案 4 :(得分:0)

在线之间阅读我认为这是一个比你知道的更难的问题。

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

您可以考虑一些选项:

  1. 表审核触发器允许您指定列,值等,以及何时更改它们,它可以实时执行此操作。那将是我的第一个解决方案。

  2. 即使只是插入,您可能希望在备份表中存储有关max ids等的信息,并在检查时仅返回一个备份。然后你可以使用a_horse_with_no_name的解决方案作为模板。