В Postgres 9.3, когда поле в таблице имеет нулевое значение, следующее выражение не работает:
update table_statatistic set members = members + 1 WHERE user_id = $1;
Однако, когда поле имеет целочисленное значение, этот запрос без проблем увеличивает его на 1.
Вопросы следующие:
Я думаю, у вас есть эта проблема, потому что вы злоупотребляете SQL NULL. Правильная семантика «неизвестна», но вы хотите рассматривать ее как 0. Возможно, вам следует добавить предложение DEFAULT 0 в определение столбца (и добавить NOT NULL, пока вы на нем). Это не только решит вашу проблему, но и упростит все запросы.


вам нужно использовать coalesce для проверки нулевых значений
update table_statatistic set members = coalesce(members, 0) + 1 WHERE user_id = $1
Вместо этого используйте COALESCE():
Функция COALESCE возвращает первый из своих аргументов, который не равен нулю. Null возвращается только в том случае, если все аргументы равны нулю. Он часто используется для замены значения по умолчанию для нулевых значений, когда данные извлекаются для отображения.
UPDATE table_statatistic SET members = COALESCE(members,0) + 1 WHERE user_id = $1;
Зачем мне использовать coalesce. Ничего + 1 = 1. Почему это происходит.
Поле со значением NULL - это поле без значения. Таким образом, вы не можете добавить 1 без значения. Null не является значением.
Это противоречит интуиции и не имеет логического смысла, null ничего не значит. Во многих языках программирования вы можете просто добавить целое число к нулю.
подскажите названия языков программирования?
@Jimski null - это не 0, это две разные вещи. null - это отсутствие какой-либо информации. Что, если бы я попросил вас добавить стул к вашему космическому кораблю. Сколько стульев было бы после этого на вашем космическом корабле?
Гупта Я могу сказать вам, что, например, в PHP вы можете добавить целое число к нулю. А-конь ... Я знаю, что null не равно нулю, поэтому выше я написал «ничего». Не пытайтесь объяснить это с помощью логики, потому что ваше объяснение нелогично. Если null действительно означает отсутствие информации, это также может означать, что поле Null содержит большое целое число, но мы просто не знаем об этом. И это явно не тот случай, если просто взглянуть на двоичные данные в поле null. Ваше второе объяснение о строго типизированных языках имеет гораздо больший смысл, поэтому я проголосовал за ваш комментарий. Спасибо.
Почему? Потому что каждое выражение с участием
nullдаетnull. Так указывается SQL. modern-sql.com/concept/null