[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: "запрет" установки значения < 0
kirik
Ребят, подскажите пожалуйста, как можно решить подобное (без доп. запросов)
Есть запрос -
SQL
UPDATE `adverts` SET `impressions` = impressions + 1, `impressions_remain` = impressions_remain - 1 WHERE `ad_id` IN (....)

как сделать так, чтобы значение поля `impressions_remain` не могло быть меньше нуля?
так как поле `impressions_remain` имеет аттрибут unsigned, то когда приходит -1, значение устанавливается максимальное для типа mediumint..

Спасибо!



Спустя 1 час, 56 минут, 58 секунд (4.12.2008 - 07:45) Sylex написал(а):
т.е. impressions плюсоваться должно, а impressions_remain если меньше нуля, то должно быть 0?

Спустя 1 минута, 20 секунд (4.12.2008 - 07:46) kirik написал(а):
Цитата
а impressions_remain если меньше нуля, то должно быть 0?

Абсолютно верно!
Перегуглил пол интернета, ничего подходящего...

Спустя 56 минут, 33 секунды (4.12.2008 - 08:43) kirik написал(а):
Фуф...решил проблему про помощи CASE:

SQL
UPDATE `adverts` SET `impressions` = `impressions` + 1, `impressions_remain` = CASE `impressions_remain` WHEN 0 THEN 0 ELSE `impressions_remain` - 1 END WHERE `ad_id` IN (...)

Спустя 6 часов, 49 минут, 30 секунд (4.12.2008 - 15:32) vasa_c написал(а):
может UNSIGNED столбцу поставить?

Спустя 7 часов, 43 минуты, 28 секунд (4.12.2008 - 23:16) kirik написал(а):
vasa_c, дело в том, что он уже unsigned. А когда в поле с аттрибутом unsigned приходит отрицательное число, то значение устанавливается максимальное для данного типа данных (у меня это mediumint, а следовательно число становится равным 16777215). Причем так происходит, если обновлять поле так - field = field - 1, а если напрямую записывать значение меньше нуля, то устанавливается, как положено - 0.

Спустя 10 минут, 14 секунд (4.12.2008 - 23:26) vasa_c написал(а):
хм.
у меня mysql 5.0.45, InnoDB таблица, столбец INT UNSIGNED
выдаёт: #1264 - Out of range value adjusted for column

Спустя 2 часа, 56 минут, 39 секунд (5.12.2008 - 02:23) Alchemist написал(а):
Цитата
Subtraction between integer values, where one is of type UNSIGNED, produces an unsigned result by default. If the result would otherwise have been negative, it becomes the maximum integer value. If the NO_UNSIGNED_SUBTRACTION SQL mode is enabled, the result is negative.

If the result of such an operation is used to update an UNSIGNED integer column, the result is clipped to the maximum value for the column type, or clipped to 0 if NO_UNSIGNED_SUBTRACTION is enabled. If strict SQL mode is enabled, an error occurs and the column remains unchanged.

Спустя 9 часов, 42 минуты, 48 секунд (5.12.2008 - 12:06) kirik написал(а):
vasa_c, у меня mysql - 5.0.51a, таблица MyISAM, столбец - mediumint unsigned.
Тоже выдает такой ворнинг, если выполнять такой запрос - UPDATE `table` SET `field` = -1
А если выполнить такой - UPDATE `table` SET `field` = `field` - 1, то все проходит нормально, и устанавливается максимальное значение.

Alchemist, Спасибо!

Итак, вывод: после открытия соединения с БД, выполняем запрос
SQL
SET SQL_MODE = 'NO_UNSIGNED_SUBTRACTION'


Спасибо, ребят за советы!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.