Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект sql_итого.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
343.55 Кб
Скачать

2 Внешние ключи

Одна из важнейших разновидностей ограничений связана с определением внешних ключей. Внешний ключ – это столбец или группа столбцов, соответствующих первичному ключу другой таблицы. Чтобы понять синтаксис выражения, определяющего внешний ключ, рассмотрим пример.

Пусть в базе данных имеются две таблицы:

– Заказы (ID_заказа, ID_клиента) – содержит сведения о том, какие заказы сделал тот или иной клиент;

– Клиенты (ID_клиента, Имя, Адрес, Телефон) — сведения о клиентах (справочник).

В таблице клиенты столбец ID_клиента является первичным ключом, т. е. его значения отличны от null и уникальны. В таблице заказы столбец ID_клиента не обязан иметь уникальные значения, поскольку один и тот же клиент может сделать несколько заказов. Вместе с тем любому значению столбца Заказы.ID_клиента соответствует единственное значение столбца клиенты.ID_клиента. При описанных условиях столбец ID_клиента таблицы Заказы является внешним ключом, ссылающимся на первичный ключ ID_клиента таблицы Клиенты.

Внешний ключ определяется как ограничение для таблицы в выражении с ключевыми словами constrain foreign key (ограничение «внешний ключ»):

CONSTRAINT FOREIGN KEY внешнийКлюч REFERENCES внешняя Та блица (первичныйКлюч)

Здесь внешнийКлюч – имя столбца или список столбцов, разде­ленных запятыми, которые определяют внешний ключ, за клю­чевым словом references (ссылки) указывается внешняя табли­ца и ее первичный ключ, на который ссылается внешний ключ.

Для рассмотренного ранее примера таблицу заказы можно опре­делить следующим образом:

CREATE TABLE Заказы

( ID_заказа INTEGER,

ID_клиента INTEGER,

CONSTRAINT FOREIGN KEY ID_клиента REFERENCES Клиенты (ID_клиента));

Использование внешних ключей обеспечивает сохранение ссы­лочной целостности базы данных при изменении и удалении записей. Если бы таблицы Заказы и Клиенты не были связаны, то при удалении записи из таблицы Клиенты в таблице Заказы могли остаться ссылки на клиента, о котором уже нет сведений. Этот факт обычно расценивается как аномалия удаления. В слу­чае определения в таблице заказы внешнего ключа ID_клиента из таблицы Клиенты не удастся удалить клиента, если он сделал хотя бы один заказ. Если требуется удалить из базы данных все, что касается определенного клиента, то сначала удаляются записи в таблице Заказы, а потом – в таблице Клиенты.

Аналогичная ситуация может произойти и при обновлении дан­ных. Например, в таблице клиенты необходимо изменить идентификатор клиента, имеющего заказы и, таким образом, внешнему ключу теперь не на что ссылаться. Это аномалия изменения. В данном случае необходимо сначала добавить новую запись в таблицу клиенты, указав в ней необходимое значение ID_клиента, затем изменить в таблице заказы все старые значения ID_клиента на то, которое только что ввели в новой записи таблицы клиенты, а затем удалить из таблицы клиенты запись со старым идентификатором клиента.

Чтобы в таблицах, связанных внешним ключом, не делать мо­дификацию данных в несколько этапов, в выражении constrain foreign key можно использовать дополнительные ключевые слова:

– on delete cascade | set null (при удалении каскадировать | установить null);

– ON UPDATE CASCADE | SET NULL (при обновлении каскадировать | установить null).

Здесь вертикальная черта не является элементом синтаксиса, а лишь разделяет возможные варианты ключевых слов.

Так, при использовании on delete cascade в случае удаления записи со значением первичного ключа, которое имеется во внешнем ключе другой таблицы, соответствующие записи уда­ляются автоматически из двух таблиц. Например, при удалении из таблицы клиенты записи о клиенте, имеющем заказы, в таб­лице Заказы также будут удалены все записи, ссылающиеся на данного клиента. Чтобы данная стратегия выполнялась, таблица Заказы должна быть определена следующим образом:

CREATE TABLE Заказы

(ID_заказа INTEGER,

ID_клиента INTEGER,

CONSTRAINT FOREIGN KEY ID_клиента

REFERENCES Клиенты (ID_клиента)

ON DELETE CASCADE);

Однако на практике обычно предпочитают сначала убедиться, что клиент не имеет заказов, и лишь затем вычеркнуть его из справочника.

Вариант set null обычно используется при обновлении данных. Например:

CREATE TABLE Заказы ( ID_заказа INTEGER,

ID клиента INTEGER,

CONSTRAINT FOREIGN KEY ID_клиента

REFERENCES Клиенты (ID_клиента)

ON UPDATE SET NULL);

В данном случае при изменении (в том числе и при удалении) в таблице клиенты записи, на которую ссылается внешний ключ таблицы Заказы, значения внешнего ключа устанавливаются в null. Однако этот вариант не сработает, если на столбец Заказы.ID_клиента наложено ограничение not null. Обычно так и бывает, поскольку при оформлении заказа клиент должен быть обязательно указан. Поэтому, на всякий случай, лучше ис­пользовать ключевые слова on update cascade.

Лекция 5 «Выполнение запросов в SQL»

План

1 Оператор SELECT

2 Оператор FROM

3 Оператор WHERE

3.1 Сравнение

3.2 Диапазон

3.3 Принадлежность множеству

3.4 Соответствие шаблону

3.5 Значение NULL

4 Предложение ORDER BY

1 Оператор SELECT

Оператор SELECT – один из наиболее важных и самых распространенных операторов SQL. Он позволяет производить выборки данных из таблиц и преобразовывать к нужному виду полученные результаты. Будучи очень мощным, он способен выполнять действия, эквивалентные операто­рам реляционной алгебры, причем в пределах единственной выполняемой команды. При его помощи можно реализовать сложные и громоздкие усло­вия отбора данных из различных таблиц.

Оператор SELECT – средство, которое полностью абстрагировано от вопросов представления данных, что помогает сконцентрировать внимание на проблемах доступа к данным. Примеры его использования наглядно демонстрируют один из основополагающих принципов больших (про­мышленных) СУБД: средства хранения данных и доступа к ним отделены от средств представления данных. Операции над данными производятся в масштабе наборов данных, а не отдельных записей. Оператор SELECT имеет следующий формат:

SELECT [ALL | DISTINCT ] {*|[имя_столбца

[AS новое_имя]] [,...n]

FROM имя_таблицы [[AS] псевдоним] [,...n]

[WHERE <условие_поиска>]

[GROUP BY имя_столбца [,...n]]

[HAVING <критерии выбора групп>]

[ORDER BY имя_столбца [,...n]]

Оператор SELECT определяет поля (столбцы), которые будут входить в результат выполнения запроса. В списке они разделяются запятыми и приводятся в такой очередности, в какой должны быть представлены в ре­зультате запроса. Если используется имя поля, содержащее пробелы или разделители, его следует заключить в квадратные скобки. Символом * можно выбрать все поля, а вместо имени поля применить выражение из нескольких имен.

Если обрабатывается ряд таблиц, то (при наличии одноименных по­лей в разных таблицах) в списке полей используется полная спецификация поля, т.е. Имя_таблицы.Имя_поля.