ALTER TABLE progress
ADD CHECK (
( test_form = 'экзамен' AND mark IN ( 3, 4, 5 ) )
OR
( test_form = 'зачет' AND mark IN ( 0, 1 ) )
);
Проверьте, как будет работать новое ограничение в модифицированной табли-
це progress. Для этого выполните команды INSERT как удовлетворяющие огра-
ничению, так и нарушающие его.
В таблице уже было ограничение на допустимые значения атрибута mark. Как
вы думаете, не будет ли оно конфликтовать с новым ограничением? Проверьте
эту гипотезу. Если ограничения конфликтуют, тогда удалите старое ограниче-
ние и снова попробуйте добавить строки в таблицу.
Подумайте, какое еще ограничение уровня таблицы можно предложить для
этой таблицы?
3.* В определении таблицы «Успеваемость» (progress) на атрибуты term и mark на-
ложены как ограничения CHECK, так и ограничение NOT NULL. Возникает во-
прос: не является ли ограничение NOT NULL избыточным? Ведь мы в ограни-
чении CHECK явно указали допустимые значения. Проверьте гипотезу об избы-
точности ограничения NOT NULL в данном случае. Для этого модифицируйте
таблицу, убрав ограничение NOT NULL, и попробуйте добавить в нее строку с
отсутствующим значением атрибута term (или mark).
4. В определении таблицы «Успеваемость» (progress) для атрибута mark не только
задано ограничение CHECK, но и установлено значение по умолчанию с помо-
щью ключевого слова DEFAULT:
mark numeric( 1 ) NOT NULL
CHECK ( mark >= 3 AND mark <= 5 )
DEFAULT 5,
Как вы думаете, что будет, если в ограничении DEFAULT мы «случайно» допу-
стим ошибку, написав DEFAULT 6? На каком этапе эта ошибка будет выявлена:
уже на этапе создания таблицы или только при вставке строки в нее, если в ко-
манде INSERT не указать значение для атрибута mark?
Вот эта команда может быть вам полезной для проверки гипотезы, поскольку в
ней отсутствует передаваемое значение для атрибута mark:
Достарыңызбен бөлісу: |