2017-06-21 56 views
0

的過程,讓我們說,我有如何申請在PostgreSQL中的表的每一行(未觸發)

T1

a | b | t2_a 
---+----+------ 
1 | 10 | 
2 | 11 | 
3 | 12 | 
4 | 14 | 
5 | 16 | 

(在t2_a所有值都爲空,我只是添加列)

T2

a | b 
---+---- 
1 | 11 
2 | 12 
3 | 13 
4 | 16 

我需要添加一個新的行T2t1.bt2.b,所以手術後,T2變爲:

a | b 
---+---- 
1 | 11 
2 | 12 
3 | 13 
4 | 16 
5 | 10 
6 | 14 

,現在我需要更新T1滿足這個條件(t1.t2_a=t2.a AND t1.b=t2.b),所以在手術後T1變爲:

a | b | t2_a 
---+----+------ 
1 | 10 | 5 
2 | 11 | 1 
3 | 12 | 2 
4 | 14 | 6 
5 | 16 | 4 

我不需要算法,我只需要知道什麼是可用的PostgreSQL機制來對錶的每一行執行這樣的改變。

我想我會做一個觸發器和PostgreSQL的過程之前或T1更新後,但我沒有任何更新,我想我不能只是寫UPDATE t1觸發..我的觸發器。

回答

2

我假設列a在兩個表中都是連續的。

第一操作是insert ... select ...

insert into t2(b) 
select b 
from t1 
where not exists (
    select 1 
    from t2 
    where t2.b = t1.b) 
returning *; 

a | b 
---+---- 
5 | 10 
6 | 14 
(2 rows) 

對於其它用途update ... from ...

update t1 
set t2_a = t2.a 
from t2 
where t1.b = t2.b 
returning t1.*; 

a | b | t2_a 
---+----+------ 
1 | 10 | 5 
2 | 11 | 1 
3 | 12 | 2 
4 | 14 | 6 
5 | 16 | 4 
(5 rows) 
+0

但隨後T2不會被修改。 – user544262772

+0

t2在第一個查詢中被修改,t1在第二個查詢中被修改。 – klin

+0

我不好,沒看見。 thakns – user544262772