Обновление PostgreSQL не возвращает ноль - PullRequest
0 голосов
/ 02 ноября 2009

Я пытался обновить определенную запись с тем же значением снова и снова, но он возвращает значение затронутых строк как 1 всегда.

update users set active = 1 where id = 304
1 row(s) affected.

снова тот же запрос

update users set active = 1 where id = 304
1 row(s) affected.

но второе обновление должно вернуть 0 затронутых строк, верно? Могу ли я узнать, как получить нулевой счет, если запись не обновляется изначально?

Ответы [ 3 ]

8 голосов
/ 02 ноября 2009

Безусловно, установка значения столбца всегда «влияет» на него, даже если новое значение совпадает со старым. Если вы хотите видеть только то, отличается ли значение сейчас, вы можете проверить количество строк, затронутых чем-то вроде

UPDATE users SET active=1 WHERE id = 304 AND active != 1;

Таким образом, запрос на обновление соответствует только строкам, которые еще не «активны»

3 голосов
/ 02 ноября 2009

Ваш запрос обновляет запись, поэтому возвращает 1.

Обновление не проверяет, есть ли заменяющее значение, уже там.

1 голос
/ 02 ноября 2009

Как уже указывал Schlansker, следующее будет делать то, что вы просите.

UPDATE users SET active = 1 WHERE id = 304 AND active <> 1;

Но не забывайте об изоляции транзакций. То есть если две параллельные транзакции обновляют одну и ту же строку (или если одна из них удаляет ее), вы можете оказаться в неожиданном состоянии. Это зависит от уровня изоляции транзакции и от того, как спроектирована остальная часть приложения.

...