Какой вариант SQL-ограничения гарантирует, что значение баланса всегда будет неотрицательным?

22.04.2026 02:20
Обновлено: 22.04.2026 02:20

Подробное объяснение

Правильный вариант — 'numeric not null check (balance >= 0)', так как он сочетает три важных аспекта: тип данных numeric для точного представления денежных значений, ограничение not null для исключения пустых значений и явную проверку check (balance >= 0), которая прямо запрещает отрицательные числа. Другие варианты либо зависят от конкретной СУБД, либо содержат синтаксические ошибки, либо не обеспечивают полную гарантию неотрицательности. Этот подход является наиболее универсальным и соответствует стандартам SQL.

Часто задаваемые вопросы (FAQ)

1 В чем разница между CHECK и NOT NULL в SQL?
NOT NULL гарантирует, что столбец не может содержать пустое значение (NULL), а CHECK позволяет задать произвольное условие для значений, например, проверку на неотрицательность или диапазон.
2 Почему для баланса лучше использовать numeric, а не integer?
Тип numeric (или decimal) поддерживает точные десятичные значения с фиксированной точностью, что важно для денежных операций, тогда как integer работает только с целыми числами и может привести к потере точности.
3 Можно ли использовать unsigned для запрета отрицательных значений в любой СУБД?
Нет, unsigned — это специфичная для некоторых СУБД (например, MySQL) возможность, которая не является частью стандарта SQL и не поддерживается во всех системах, поэтому для переносимости лучше использовать CHECK.

Типичные ошибки

1 Использование unsigned как универсального решения
Это неверно, потому что unsigned поддерживается не во всех СУБД (например, в PostgreSQL его нет), что делает код непереносимым и ненадежным для гарантии неотрицательности.
2 Пропуск NOT NULL при использовании CHECK
Без NOT NULL значение может быть NULL, что не нарушает условие balance >= 0, но оставляет возможность пустых значений, что может быть недопустимо для баланса.
3 Неправильный синтаксис в CHECK, например, 'check balance >= 0' без скобок
В стандартном SQL условие CHECK должно быть заключено в скобки: CHECK (balance >= 0), иначе запрос вызовет синтаксическую ошибку при выполнении.

Установите расширение Poresh.Ai

Решайте тесты мгновенно с помощью искусственного интеллекта прямо в браузере

Автоматическое распознавание вопросов
ИИ-анализ и подробные объяснения
Работает на любых образовательных платформах
Безопасно и конфиденциально