- •Организация хранения данных в sql Server
- •Страницы
- •Экстенты
- •Использование sql Server Management Studio
- •Создание баз данных в sql Server Management Studio
- •Использование ограничений на умолчания
- •Обеспечение целостности сущностей
- •Использование первичных ключей
- •Использование ограничений на уникальность
- •Обеспечение целостности ссылок
- •Использование внешних ключей
Использование первичных ключей
Первичный ключ используется для обеспечения гарантии уникальности каждой записи в таблице. Он выполняет эту задачу путем создания индекса специального типа, называемого уникальным индексом. Обычный индекс используется для ускорения доступа путем считывания всех значений в столбце и хранении организованного списка, локализующего запись с этим значением. Уникальный индекс генерирует не только этот список, но и не позволяет дублировать значения для хранения в индексе. Если пользователь пытается ввести в индексированное поле дублированное значение, то уникальный индекс вернет ошибку, а модификация данных не будет выполнена.
Предположим, что в качестве первичного ключа вы определили поле CustID таблицы Customers, и в таблице уже имеется клиент с идентификатором, равным 1. Если один из ваших пользователей попытается создать запись о другом клиенте с тем же номером, то он получит ошибку, а обновление не будет выполнено, поскольку значение CustID 1 уже перечислено в уникальном индексе первичного ключа. Конечно, это всего лишь пример: ваше поле CustID имеет заданное свойство identity, которое автоматически присваивает номер каждой вставляемой записи и не позволит вводить номера по своему усмотрению.
Первичный ключ должен быть создан из столбца (или столбцов) с уникальными значениями. Столбец identity является идеальным кандидатом на роль первичного ключа, поскольку значения, содержащиеся в нем, являются уникальными по определению. В таблице Customers имеется столбец identity, из которого мы создадим первичный ключ.
Откройте SQL Server Management Studio и выполните подключение с использованием аутентификации Windows.
В Object Explorer раскройте папки Databases=>Sales=>Tables.
Щелкните правой кнопкой мыши на таблице Customers и выберите команду Modify Table.
В окне конструктора таблиц щелкните правой кнопкой на поле CustID в столбце Column Name и выберите команду Set Primary Key.
Обратите внимание на то, что слева от поля CustID теперь отображен значок ключа, указывающий, что поле является первичным ключом (рис. 18).
Когда вы щелкнете в панели инструментов на значке Save, SQL Server создаст уникальный индекс, гарантирующий отсутствие дублированных значений в поле CustlD.
Закройте конструктор таблиц.
Эта процедура проста, однако предположим, что нужно поддерживать целостность сущности отдельно в нескольких столбцах. Например, у нас имеется таблица Employees с полем EmployeelD, определенным как первичный ключ, а также поле Social Security Number, в котором требуется обеспечить целостность сущности. Поскольку в таблице может быть лишь один первичный ключ, для обеспечения такой целостности сущности вам понадобится создать уникальное ограничение.
Рис. 18. В таблице создан первичный ключ
Использование ограничений на уникальность
Между ограничениями первичного ключа и ограничениями на уникальность существует два глобальных отличия. Первое состоит в том, что первичные ключи используются вместе с внешними ключами для обеспечения целостности ссылок, чего не могут уникальные ключи. Второе отличие заключается в том, что ограничения на уникальность позволяют вставлять в поле пустые значения, чего нельзя делать с помощью первичных ключей. Во всем остальном они служат одной цели — обеспечить уникальность данных, вставляемых в поле.
Ограничение на уникальность следует использовать в тех случаях, когда нужно гарантировать, что дублированные значения не будут добавляться в поле, не являющееся частью первичного ключа.
Поскольку идеального кандидата на роль уникального ограничения в наших таблицах нет, вы можете создать его в поле Phone.
В SQL Server Management Studio щелкните на кнопке New Query.
В раскрывающемся списке баз данных в панели инструментов выберите Sales.
Введите и выполните следующий код:
ALTER TABLE customers
ADD CONSTRAINT CK_Phone
UNIQUE (Phone)
В окне Object Explorer щелкните правой кнопкой на базе данных Sales и выберите команду Refresh.
Расширьте папки Sales=>Tables=> Customers=> Keys.
Ваше уникальное ограничение будет перечислено в папке Keys вместе с первичным ключом, созданным ранее (рис. 19).
Рис. 19. В папке Keys перечислено также и ограничение на уникальность
Теперь вы можете протестировать ограничение на уникальность, попытавшись добавитъ несколько дублирующихся телефонных номеров посредством Query Analyzer с помощью инструкции INSERT.
Выберите пункт меню Query=>New Query.
Введите и выполните следующий код, добавляющий новую запись в таблицу Customers:
USE sales
INSERT customers
VALUES ('Shane','Travis','806Star','Phoenix','AZ','85103','6021112222')
Повторите выполнение запроса. Запрос не был выполнен, а в нижней части появилось сообщение о том, что дублированный телефонный номер нарушает ограничение UNIQUE_KEY .
Итак, вы знаете, как защитить вводимые в таблицу данные путем обеспечения целостности домена и сущности; осталось рассмотреть еще один тип целостности. Вам нужно знать, как защитить связанные данные, хранящиеся в разных таблицах, путем обеспечения целостности ссылок.
