Шрифт:
ALTER TABLE MAN
ADD CONSTRAINT fk_MAN_CITY_CODE
FOREIGN KEY (CITYCODE)
REFERENCES CITY (CITYCODE);
Ограничение CHECK на вставку и изменение данных
– вычитание;
Синтаксис
ALTER TABLE TABLENAME ADD CONSTRAINT CHECK_NAME
CHECK (condition);
Здесь condition – условие, CHECK_NAME – наименование ограничения, TABLENAME – имя таблицы.
Пример
Ограничение в таблице MAN на возраст (YEAROLD) больше 16 лет:
ALTER TABLE MAN ADD CONSTRAINT CHECK_YEAROLD_MAN
CHECK (YEAROLD> 16);
Важные замечания
Ограничение уникальности можно также создавать для нескольких колонок таблицы, это делается следующим образом:
ALTTER TABLE CITY ADD CONSTRAINT CITY_uniq
UNIQUE (CITYNAME, CITYCODE);
При этом отдельно необходимо контролировать вставку пустых значений для соответствующих полей таблицы.
Существуют дополнительные опции для создания ограничений ссылочной целостности:
• On delete cAScade – автоматическое удаление связанных строк по внешнему ключу;
• On delete NULL – значение внешнего ключа устанавливается в NULL.
При создании множества ограничений CHECK необходимо, чтобы между ними не было конфликтов, то есть чтобы правила не противоречили друг другу.
Условие в ограничении CHECK может ссылаться на любой столбец таблицы, но не может ссылаться на столбцы другой таблицы.
Вопросы учеников
Чем ограничение на уникальность UNIQUE отличается от первичного ключа (Primary KEY)?
Первичный ключ в таблице может быть только один, ограничений на уникальность может быть много. В таблице в поле с ограничением уникальности допускается вставка пустых значений. Также для первичного ключа создается специальный индекс (pk).
Если колонка в таблице содержит пустые значения, а мы добавляем к этой колонке ограничение NOT NULL, что произойдет?
Вы получите сообщение об ошибке, и ограничение не будет добавлено.
Можно ли создавать ограничения для колонок BLOB, CLOB?
Нет, некоторые виды ограничений можно создавать только для простых типов полей.
Контрольные вопросы и задания для самостоятельного выполнения
1. Добавьте ограничение для уникальных значений на колонки PHONENUM таблицы AUTO.
2. Добавьте ограничение на вставку пустых значений для колонки YEAROLD в таблице MAN.
3. Добавьте ограничение CHECK для колонки YEAROLD в таблице MAN, чтобы YEAROLD было меньше 100.
4. Добавьте ограничение ссылочной целостности для двух таблиц – AUTO и MAN.
Шаг 10. Индексы
Введение
Индексы – это специальные ссылочные массивы в базах данных. Назначение индексов – ускорение поиска данных, процессов сортировки данных. Обычно индексы увеличивают производительность запросов к базе данных.
Теория и практика
Индексы работают по принципу b-tree, то есть сбалансированной древовидной структуры.
Для примера: у нас в одной из колонок таблицы есть уникальные значения от 1 до 500 000.
Нам необходимо найти значение 255 000. По ссылочному индексу мы определяем, больше или меньше искомое значение 250 000, то есть половины всех значений, далее больше или меньше искомое значение 260 000, далее мы переходим к нашему значению 255 000.
Мы не просматривали каждую запись таблицы, а нашли наше значение за несколько итераций.
Индексы создаются для определенной колонки (колонок) таблицы.
Процесс пересоздания индексов может занимать значительное время, это необходимо учитывать при операциях вставки и обновления, удаления данных.
Синтаксис
CREATE INDEX IDx_NAME ON TABLE_NAME (column_NAME);
Idx_NAME – наименование индекса;
TABLE_NAME – наименование таблицы, где создается индекс;
column_NAME – наименование колонки, для которой создается индекс.
Пример создания индекса для колонки MARK таблицы AUTO:
CREATE INDEX IDx_AUTO_MARK ON AUTO (MARK);
Реверсивный индекс
Если нам необходимо более часто читать записи, отсортированные в обратном порядке, тогда имеет смысл использовать реверсивные индексы. Например, есть таблица валют, в своих расчетах мы чаще используем данные с более поздней датой курса валют, в этом случае действительно лучше использовать реверсивный индекс для даты курса валют.