我正在使用postgres并拥有2个表Transaction和Backup。 我想将数据行从Transaction传输到Backup。
Transaction表中会有新的数据行。
如何只传输具有不同值的数据行作为Transaction表中的现有数据,因为我不希望有重复的数据行?
只要列中的1中的数据不同,我就会将该行从事务转移到备份。
e.g
第1天:交易(20行),备份(20行)[所有交易文件备份到晚上备份]
第2天:交易(40行),备份(20行)[事务中的额外20行可能包含重复行,作为事务中的前20行。我只想将非重复行传输到Backup]
答案 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上面有一个正确的解决方案,假设你的数据只是附加(所有插入,没有更新),但它不会表现得很好,因为这些表赌得更大。
您可以考虑一些选项:
表审核触发器允许您指定列,值等,以及何时更改它们,它可以实时执行此操作。那将是我的第一个解决方案。
即使只是插入,您可能希望在备份表中存储有关max ids等的信息,并在检查时仅返回一个备份。然后你可以使用a_horse_with_no_name的解决方案作为模板。