Страницы

Поиск по вопросам

пятница, 13 марта 2020 г.

Минимальное значение в MySQL

#mysql


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


Ответы

Ответ 1



тип данных int unsigned / bigint unsigned / и т.д. При попытке записать число меньше нуля, будет бросать ошибку, ловишь ее или игнорируешь. Никакие триггеры тут не нужны. Т.е. можешь, конечно, сделать триггер, но ты замечательно (в том смысле, что ты сможешь заметить глазёнками время выполнения на большом апдейте/инсерте) просядешь по производительности. Триггер мог бы быть нужен, если есть определенное минимальное значение, допустим, 10. Но на самом деле и здесь он не нужен, поскольку вычитать 10 из добавляемого значения надо еще до записи в базу, на уровне приложения. Минимальное допустимое значение может измениться (например, какой-нибудь НДС), и тебе в итоге придется следить и за кодом и за триггером. http://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html mysql> create table uns (ab int unsigned); Query OK, 0 rows affected (0.23 sec) mysql> insert into uns values(2); Query OK, 1 row affected (0.03 sec) mysql> insert into uns values(-1); ERROR 1264 (22003): Out of range value for column 'ab' at row 1 mysql> update uns set ab = -1; ERROR 1264 (22003): Out of range value for column 'ab' at row 1 mysql> update uns set ab = ab-1000; ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`db`.`uns`.`ab` - 1000)' т.е. на самом деле unsigned нужен для дополнительных гарантий по консистентности данных в базе и для ловли ошибок в коде. Ну и для тех случаев, когда вы знаете, что у вас могут быть ооочень большие, например ID. Поскольку unisgned тип, условно говоря, даст в два раза больше положительных значений, чем signed тип. Поэтому игнорировать не советую.

Комментариев нет:

Отправить комментарий