Postgresql
更新不同子句的不同列
我在 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
如果我用
id
7 和col1
5 和col2
6 添加一個新行,表格將變為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