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