Глава 23. Ограничения

Теперь, когда наша БД становится всё сложней, а между таблицами появляются связи, особенно важным становится поддержание состоятельности данных.

Какие проблемы возможны при заполнении таблиц?

Во-первых, поскольку поля pupil.id, olymp.id и subject.id служат для однозначной идентификации записи, совершенно недопустимо появление в таблице нескольких записей с одним и тем же значением поля id. Поэтому нужно наложить на эти поля при создании таблиц ограничение уникальности, указав при описании поля слово UNIQUE.

Во-вторых, поскольку всё те же поля id не должны принимать значение NULL. Это ограничение, как уже упоминалось, изначально заложено в типе SERIAL. Для полей других типов наложить такое ограничение можно, добавив фразу NOT NULL.

Ещё имеет смысл ограничить возможные значения поля pupil.graduate положительными значениями (тип INTEGER допускает и отрицательные). Добиться такого ограничения можно, добавив фразу CHECK (graduate>0). При желании можно дополнительно усилить это ограничение, изменив выражение в скобках. Например, чтобы ограничить диапазон годов 21 веком, можно написать CHECK (graduate>2000 AND graduate<=2100). Подобным образом запрещается принимать значение «пустая строка» полям pupil.name, pupil.school, а также subject.name.

Ещё один вид ограничений следует наложить на поля result.pupil_id, result.olymp_id. Эти поля, по нашему замыслу, должны иметь те же значения, то и соответственно поля pupil.id и olymp.id — ведь по этим полям связываются таблицы! Точно так же нужно ограничить возможные значения поля olymp.subject_id значениями поля subject.id.

Суммируем все наши соображения:

pupil
olymp
result
subject

Информатика-54