Теперь, когда наша БД становится всё сложней, а между таблицами появляются связи, особенно важным становится поддержание состоятельности данных.
Какие проблемы возможны при заполнении таблиц?
Во-первых, поскольку поля 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.
Суммируем все наши соображения:
UNIQUENOT NULL CHECK (name!='')NOT NULL CHECK (school!='')CHECK (graduate>2000 AND graduate<=2100)UNIQUEREFERENCES subject (id)CHECK (class>0 AND class<=11)CHECK (result_max>=0)CHECK (result>=0)REFERENCES pupil (id)REFERENCES olymp (id)NOT NULL UNIQUENOT NULL CHECK (name!='')