INSERT INTO students ( record_book, name, doc_ser, doc_num )
VALUES ( 12300, '', 0402, 543281 );
138
Контрольные вопросы и задания
Наверное, проектируя эту таблицу, мы хотели бы все же, чтобы пустые строки
в качестве значения атрибута name не проходили в базу данных? Какое реше-
ние вы можете предложить? Видимо, нужно добавить ограничение CHECK для
столбца name. Если вы еще не изучили команду ALTER TABLE, то удалите табли-
цу students и создайте ее заново с учетом нового ограничения, а если вы уже
познакомились с командой ALTER TABLE, то сделайте так:
ALTER TABLE students ADD CHECK ( name <> '' );
Добавив ограничение, попробуйте теперь вставить в таблицу students строку
(row), в которой значение атрибута name было бы пустой строкой (string).
Давайте продолжим эксперименты и предложим в качестве значения атрибута
name строку, содержащую сначала один пробел, а потом — два пробела.
INSERT INTO students VALUES ( 12346, ' ', 0406, 112233 );
INSERT INTO students VALUES ( 12347, ' ', 0407, 112234 );
Для того чтобы «увидеть» эти пробелы в выборке, сделаем так:
SELECT *, length( name ) FROM students;
Оказывается, эти невидимые значения имеют ненулевую длину. Что делать,
чтобы не допустить таких значений-невидимок? Один из способов: возложить
проверку таких ситуаций на прикладную программу. А что можно сделать на
уровне определения таблицы students? Какое ограничение нужно предло-
жить? В разделе 9.4 документации «Строковые функции и операторы» есть
функция trim. Попробуйте воспользоваться ею. Если вы еще не изучили коман-
ду ALTER TABLE, то удалите таблицу students и создайте ее заново с учетом
нового ограничения, а если уже познакомились с ней, то сделайте так:
ALTER TABLE students ADD CHECK (...);
Есть ли подобные слабые места в таблице «Успеваемость» (progress)?
10. В таблице «Студенты» (students) атрибут «Серия документа, удостоверяюще-
го личность» (doc_ser) имеет числовой тип, однако в сериях таких документов
могут встречаться лидирующие нули, которые в числовых столбцах не сохраня-
ются. Например, при записи значения серии «0402» первый ноль не сохранится.
Модифицируйте таблицу students, заменив числовой тип данных на символь-
ный, например, character. Как вы думаете, эта операция пройдет без затруд-
нений или они все же возможны? Проверьте ваши предположения, выполнив
модификацию.
139
|