2017-03-16 22 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