Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 仅当大于最小值时才递减postgres中的整数_Postgresql - Fatal编程技术网

Postgresql 仅当大于最小值时才递减postgres中的整数

Postgresql 仅当大于最小值时才递减postgres中的整数,postgresql,Postgresql,我有一个这样的语句,我用它来递减计数器: UPDATE stats SET counter = counter - 1 WHERE id = 24235; 问题是,我从不希望计数器低于1。如何执行update语句,该语句将只递减到1 PG版本9.3 UPDATE stats SET counter = counter - 1 WHERE id = 24235 AND counter > 1; 如果递减量不同,则必须确保在两个位置传递相同的值 UPDATE stats SET cou

我有一个这样的语句,我用它来递减计数器:

UPDATE stats SET counter = counter - 1 WHERE id = 24235;
问题是,我从不希望计数器低于
1
。如何执行update语句,该语句将只递减到
1

PG版本9.3

UPDATE stats
SET counter = counter - 1
WHERE id = 24235
  AND counter > 1;
如果递减量不同,则必须确保在两个位置传递相同的值

UPDATE stats
SET counter = counter - ?
WHERE id = ?
  AND counter > ?;
您可以使用一些伪代码调用它,比如
sql.execute(decrement,id,decrement)

如果计数器永远不应该低于1,我会在该字段上添加一个约束<代码>计数器整数检查(计数器>0)

另一种方法

UPDATE stats SET counter = (
  CASE WHEN counter > 1 
  THEN (counter - 1) 
  ELSE 1 END
) WHERE id = 24235;

请问是什么版本的Postgres?我和你一样被迷惑了,走上了条件编程的道路,寻找一个特殊的Postgres IF语句。一个WHERE条件就可以了。对于更改一行,这是可以的。如果您要更改很多行,其中很大一部分可能已经有计数器位于1,我很想知道Postgres是否足够聪明,能够利用计数器上的索引。