Postgresql

更新不同子句的不同列

  • August 17, 2014

我在 Postgres 9.3 中有一個具有以下佈局的數據庫表:

id   SERIAL,
col1 INT,
col2 INT

每當插入新行時,我將不得不更新所有行col1和/或col2在不同情況下,但只想在一個(更快)查詢中執行此操作以避免性能問題(特別是因為我必須在表中進行鎖定以避免腐敗)。

現在它通過兩個查詢完成:

UPDATE tablename 
SET col1 = col1 + 2
WHERE col1 > $VAR

UPDATE tablename
SET col2 = col2 + 2
WHERE col2 >= $VAR

注意,$VAR在兩個查詢中是相同的。它是col1新行的值。

我在 PostgreSQL 手冊中找不到與此問題相關的任何內容。

範例數據庫

ID | col1 | col2
1  |   1  |  12
2  |   2  |  5
3  |   3  |  4
4  |   6  |  11
5  |   7  |  8
6  |   9  |  10

如果我用id7 和col15 和col26 添加一個新行,表格將變為

ID | col1 | col2
1  |   1  |  14
2  |   2  |  7
3  |   3  |  4
4  |   8  |  13
5  |   9  |  11
6  |   11 |  12
7  |   5  |  6

在這種情況下,所有行至少更改了一列。但是在一個有一千行的表中,大多數甚至都不會改變,所以我相信使用CASE不會對性能有好處。

我可能會做這樣的事情:

UPDATE tablename
SET col1 = col1 + CASE WHEN col1 > $VAR THEN 2 ELSE 0 END,
   col2 = col2 + CASE WHEN col2 >= $VAR THEN 2 ELSE 0 END
WHERE col1 > $VAR OR col2 >= $VAR

如果您只更新幾行並且有很多行,請確保col1和被索引。col2``tablename

引用自:https://dba.stackexchange.com/questions/74147