2016-08-01 91 views
1

正如我的標題所說,我想在SQL中增加表中所有行的列值。增加所有行的FK列值SQL

假設我在tab_a有這些數據和PK是:fk_afk_bfk_c

|fk_a|fk_b|fk_c| 
|1 |2 |2 | 
|1 |2 |3 | 

如果我做了以下更新語句:

update tab_a 
set fk_c = fk_c + 1 

我的查詢會抱怨說,數據(1,2,3)已經存在,但它不應該抱怨,因爲我將更新每一行,因此行(1,2,3)應該變爲(1,2,4)。

我該如何做到這一點?

+1

刪除唯一約束。進行更改。將約束添加回來。 –

+0

請將表格的數據定義添加到您的問題中。順便說一句:也許你需要延期約束。 BTW2:改變主鍵(或唯一鍵/候選鍵)的值通常是一個壞主意,不管怎樣,爲什麼*是唯一的? – joop

+0

向我們展示兩個表格定義。 – jarlh

回答

2

的主鍵應該是緩徵最初推遲:

create table tab_a(
    fk_a int, 
    fk_b int, 
    fk_c int, 
    primary key (fk_a, fk_b, fk_c) deferrable initially deferred 
    ); 

insert into tab_a values 
(1, 2, 3), 
(1, 2, 4); 

update tab_a 
set fk_c = fk_c + 1 
returning *; 

fk_a | fk_b | fk_c 
------+------+------ 
    1 | 2 | 4 
    1 | 2 | 5 
(2 rows)