Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 17. Создание таблиц

Индексы - средство SQL, созданное из коммерческих соображений. В связи с этим стандарт ANSI в настоящее время практически их не поддерживает, но они весь­

ма полезны и используются на практике.

Когда создается индекс по значениям какого-либо поля для базы данных, создается упорядоченный список значений для этого поля. Предположим, таблица Customers имеет тысячи строк и нужно найти покупателя с номером 2999. Поскольку строки не упорядочены, программа должна просмотреть всю таблицу, строку за строкой, и вы­ брать ту, в которой значение поля cnum равно 2999. Если бы по полю cnum был орга­ низован индекс, программа могла бы сразу найти в нем значение 2999 и получить информацию о том, как обнаружить нужную строку таблицы. Это может значительно

улучшить выполнение запросов, но управление индексами существенно замедляет

время выполнения операций обновления (таких как INSERT и DELETE); кроме того, сам индекс занимает место в памяти. Следовательно, перед созданием индексов следу­

ет тщательно проанализировать ситуацию.

Индексы можно создавать по множеству полей. Если указано более одного поля

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

поля, по которому осуществляется индексирование. Внутри получившихся групп осу­

ществляется упорядочение по значениям второго поля, для получившихся в результа­

те групп осуществляется упорядочение по значениям третьего поля и т.д. Если есть

·первое и последнее имена для двух разных полей таблицы, можно создать индекс, ко­ торый упорядочивает первое внутри последнего. Это можно сделать независимо от порядка строк в таблице.

Синтаксис команды создания индекса обычно выглядит так:

CREATE INDEX <имя индекса> ON <имя таблицы> (<имя столбца>

[,<имя столбца>] .. );

Таблица должна быть уже создана и содержать столбцы, имена которых указаны в команде. Имя индекса, определенное в команде, должно быть уникальным в базе дан­ ных, то есть оно не может использоваться для каких-либо других целей любым пользо­ вателем базы данных. Будучи однажды созданным, индекс является невидимым для пользователя. SQL сам решит, когда есть смысл воспользоваться индексом, и сделает это автоматически. Например, если часто используется таблица Customers для поиска

клиентов дпя конкретных продавцов по значениям поля snum, следует создать индекс по

полю snшn таблицы Customers.

CREATE INDEX Clientgгoup ON Customers(snum);

Теперь вы можете быстро найти клиентов для продавцов.

Уникш~ьные индексы

Для индекса в предыдущем примере уникальность не нужна. Данный продавец

может иметь любое количество покупателей. Это становится неприемлемым, если ключевое слово UNIQUE используется перед ключевым словом INDEX. Поле

180

Изменение таблицы, которая у:нсе была создана

cnum, как первичный ключ, может быть первым кандидатом на создание уникаль­

ного индекса:

CREATE UNIQUE INDEX Custid ON Customers(cnum);

Замечание: Эта команда будет отвергнута, если в поле cnшn имеются одинаковые значения. Наилучший способ работы с индексами - немедленное их создание после создания таблицы и перед занесением в нее значений. Уникальный индекс, создавае­ мый для более чем одного поля, требует, чтобы комбинация значений во всех столбцах была уникальной.

Предыдущий пример помог выяснить, можно ли использовать поле cnum в качест­ ве первичного ключа таблицы Customers. Для базы данных можно выполнить тща­

тельное планирование первичного и других ключей.

Удшzение индексов

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

DROP INDEX <имя индекса>;

Удаление индекса не изменяет содержимого поля (полей).

Изменение таблицы, которая уже была создана

Команда ALTER TABLE (изменить таблицу), не являясь частью стандарта ANSI,

широко применяется. Форма команды достаточно прозрачна, хотя ее возможности из­

меняются в широких границах. Обычно она осуществляет добавление столбцов в таб­

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

ALTER TABLE <имя таблицы> ADD <имя столбца>

<тип данных> <размер>;

По этой команде для существующих в таблице строк добавляется столбец, в кото­ рый заносится NULL-значение. Новый столбец становится последним столбцом в таб­ лице. Допустимо добавление в нее нескольких столбцов с помощью одной команды; в этом случае их определения разделяются запятой. Можно исключать столбцы или из­ менять их описания. Часто изменение столбцов связано с изменением их размеров, добавлением или удалением ограничений. Система должна предоставить пользовате-

181

Глава 17. Создание таблиц

лю средства контроля, позволяющие удостовериться, что введенные данные, храня­

щиеся в таблице к моменту выполнения команды ALTER TABLE, удовлетворяют заданным в команде новым ограничениям. Для этого команда отвергается (выполне­ ние команды завершается аварийно). Однако, наилучший вариант - возможность двойного контроля ситуации. Необходимо изучить соответствующие разделы доку­ ментации по конкретной системе, прежде чем приступить к выполнению этой опера­ ции. Из-за нестандартной природы команды ALTER TABLE следует постоянно обращаться к документации по конкретной системе, прежде чем приступать к внесе­ нию каких-либо изменений в таблицы.

ALTER TABLE становится неоценимой, когда возникает потребность переопре­ делить таблицу, но база данных должна проектироваться так, чтобы, по возможно­ сти, избежать подобных ситуаций. Изменение структуры таблицы, используемой в настоящее время, дело рискованное. Представления таблицы, которые создаются

на основе данных, хранящихся в реальных таблицах, могут не допустить выполне­

ния этой команды; программы, использующие встроенный SQL, могут привести к ошибочной ситуации в процессе выполнения этой команды, либо могут отвергать эту команду. Кроме того, в процесс изменения таблицы могут оказаться вовлечен­ ными все пользователи, имеющие дело с этой таблицей. По этой причине следует стараться проектировать таблицы с учетом перспективы их использования, а необ­ ходимость выполнения команды ALTER TABLE следует рассматривать как край­

нюю меру.

Если система не поддерживает команду ALTER TABLE или если желательно избе­ жать применения этой команды, можно создать новую таблицу с необходимыми изме­ нениями в ее определении, а затем использовать команду INSERT с запросом SELECT * для передачи в новую таблицу существовавших ранее данных. Пользователи, имев­ шие доступ к старой таблице, автоматически наследуют право доступа к новой табли­

це.

Исключение таблицы

Необходимо быть владельцем (создателем) таблицы, чтобы иметь возможность ее удалить. Чтобы не причинить ущерба данным, хранящимся в базе данных, необходи­ мо предварительно удалить все данные из таблицы, то есть сделать ее пустой, а затем уже исключить таблицу из базы данных. Таблица, имеющая строки, не может быть удалена. Синтаксис команды, осуществляющей удаление пустой таблицы (определе­ ния таблицы) из системы таков:

DROP TABLE <имя таблицы>;

После выполнения команды, имя таблицы больше не распознается как имя табли­ цы, команды не могут работать с объектом, имя которого было указано в команде DROP. Перед выполнением команды следует удостовериться, что эта таблица не со-

182

Итоги

держит внешних ключей для какой-либо другой таблицы и что эти таблицы не исполь­

зуются для определения предстаюений

Команда реально не является частью стандарта ANSI, но поддерживается и явля­ ется полезной. Она весьма проста и не имеет различий в толковании (как команда ALTER TABLE). ANSI не оговаривает способа удаления или отказа от определений таблиц.

Итоги

Эта глава вводит вас в курс определения данных. Вы можете теперь создавать, мо­ дифицировать и удалять таблицы. Поскольку только первая из перечисленных функ­ ций является частью официального SQL-стандарта, детали остальных команд существенно различаются для различных программных продуктов, особенно для ко­ манды ALTER TABLE. DROP TABLE позволяет избавиться от таблиц, потерявших свою актуальность. Она удаляет только пустые таблицы и, следовательно, не разруша­

ет данные.

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

лизацией программного продукта. Индексы являются одним из средств воздействия

на процесс выполнения команды в SQL. Более подробно индексы и ограничения будут

рассмотрены в двух следующих главах.

183

~-----------------------------------

·-----

 

 

 

 

 

 

 

Работаем на SQL

1.Запишите предложение CREAТЕ ТABLE, которое создаст таблицу Customers.

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

3.Как можно добиться уникальности поля onum в предположении, что таблица Orders уже создана? (Предположим, что все существующие значения этого поля являются уникальными.)

4.Создайте индекс, который позволит каждому продавцу быстро осуществить по­

иск его покупателей, сгруппированных по датам.

5.Предположим, что каждый продавец должен иметь только одного покупателя с данным рейтингом. Все существующие данные удовлетворяют этому требова­

нию. Введите команду, которая этому требованию не удовлетворяет.

(Ответы см. в прило:жении А.)

184

Источник: https://studfile.net/preview/16418473/