Опубликован: 11.12.2006 | Доступ: свободный | Студентов: 5820 / 381 | Оценка: 4.42 / 3.86 | Длительность: 57:15:00
Лекция 16:

Создание и использование умолчаний, ограничений и правил

Ограничение PRIMARY KEY

Вы можете задать ограничение PRIMARY KEY по одной колонке или по нескольким колонкам. Эта колонка или колонки должны уникальным образом идентифицировать каждую строку таблицы. Чтобы задать ограничение PRIMARY KEY, выполните следующие шаги:

  1. В окне Design Table выберите колонку, щелкнув на одной из ячеек в ее строке. (Вы можете выбрать несколько колонок, удерживая клавишу Ctrl и щелкая на серых ячейках слева от имен колонок.)
  2. Щелкните правой кнопкой мыши на одной из выбранных колонок и выберите из контекстного меню пункт Set Primary Key (Задать первичный ключ). Слева от колонок, которые вы задали для первичного ключа, появится изображение небольшого ключа. На рис. 16.13 показано окно Design Table для таблицы customer после указания колонки SSN как первичного ключа. Кроме того, из колонки SSN было удалено ограничение UNIQUE путем удаления уникального индекса, поскольку нет необходимости одновременно иметь ограничение UNIQUE и ограничение PRIMARY KEY по одной колонке.
     Задание ограничения PRIMARY KEY в окне Design Table

    увеличить изображение
    Рис. 16.13. Задание ограничения PRIMARY KEY в окне Design Table
  3. Если вам нужно переместить ограничение PRIMARY KEY в другую колонку, просто задайте эту новую колонку как первичный ключ. От вас не требуется удалить сначала явным образом исходный первичный ключ – SQL Server удалит и снова создаст для вас индекс PRIMARY KEY. Вы можете также модифицировать индекс PRIMARY KEY в окне Properties. И снова напомним, что ваши изменения начнут действовать после того, как вы сохраните вашу работу, щелкнув на кнопке Save в панели инструментов.
    Примечание. Если вы изменили ограничение PRIMARY KEY по таблице, уже содержащей данные, то повторное создание индекса может занять некоторое время. Если ваша таблица содержит много данных и вы задали существенное изменение по данному индексу, такое как изменение колонок индекса или кластеризованности, то вам следует по возможности выполнять этот вид изменений в периоды незначительного использования базы данных.
Ограничение FOREIGN KEY

Чтобы создать или модифицировать ограничение FOREIGN KEY с помощью Enterprise Manager, вы можете использовать окно Design Table или создать схему базы данных с таблицами, которые будут включены в связь по внешнему ключу. Лучше всего создавать связи по внешнему ключу во время создания таблиц (или хотя бы до того, как начнется вставка данных в таблицы). Причину этого вы узнаете из следующего примера. Сначала мы рассмотрим, как использовать окно Design Table для создания ограничения FOREIGN KEY. Мы создадим связь по внешнему ключу между двумя таблицами, описанными выше в этой лекции, – items и inventory. Мы повторно создадим таблицу items с ограничением PRIMARY KEY (которое использовали раньше), но без свойства IDENTITY по колонке item_id, так как будем работать с примером, где происходит обновление этой колонки, а вы не сможете обновлять колонку со свойством IDENTITY без выполнения некоторой дополнительной работы. Кроме того, мы повторно создадим таблицу inventory без ограничения FOREIGN KEY, чтобы его можно было добавить позже. Ниже приводятся операторы CREATE TABLE, используемые для обеих таблиц:

CREATE TABLE items
( 
item_name   		char(15)     	NOT NULL, 
item_id     		smallint     	NOT NULL, 
price       		smallmoney   	NULL, 
item_desc   		varchar(30)  	NOT NULL DEFAULT 'none', 
CONSTRAINT  	PK_item_id   	PRIMARY KEY (item_id) 
) 
GO

CREATE TABLE 	inventory 
( 
store_id        		tinyint    	NOT NULL, 
item_id         		smallint   	NOT NULL,  
item_quantity   		tinyint    	NOT NULL 
) 
GO

Чтобы добавить ограничение FOREIGN KEY по таблице inventory, выполните следующие шаги:

  1. Щелкните правой кнопкой мыши на имени таблицы inventory в правой панели Enterprise Manager и выберите пункт Design Table. Щелкните правой кнопкой мыши на свободном месте этого окна и выберите из контекстного меню пункт Relationships (Связи). Появится окно Properties с открытой вкладкой Relationships (рис. 16.14).
  2. Щелкните на кнопке New. Появится данные по умолчанию (рис. 16.15).
  3. Мы выбираем для таблицы первичного ключа таблицу items (вместо customer) и колонку item_id для связи по внешнему ключу между таблицами items и inventory. Для этого просто щелкните на одной из пустых строк под именами таблиц, и в спускающемся меню появится список выбора допустимых колонок. После того как выбраны соответствующие таблицы для связи, имя в поле Relationship Name (Имя связи) изменится (рис. 16.16).
    Вкладка Relationships (Связи) окна Properties (Свойства)  для таблицы inventory

    Рис. 16.14. Вкладка Relationships (Связи) окна Properties (Свойства) для таблицы inventory
     Вкладка Relationships (Связи) с данными по умолчанию  после щелчка на кнопке New (Создать)

    Рис. 16.15. Вкладка Relationships (Связи) с данными по умолчанию после щелчка на кнопке New (Создать)
    Вкладка Relationships, где показана связь по внешнему ключу между таблицами items и inventory

    Рис. 16.16. Вкладка Relationships, где показана связь по внешнему ключу между таблицами items и inventory
  4. Внизу этого окна имеется несколько флажков (рис. 16.17). Установите флажок Check existing data on creation (Проверять существующие данные при создании), если вы хотите, чтобы SQL Server проверял существующие данные на связь по внешнему ключу. Если данные не согласуются, то ограничение не будет создано. Сбросьте этот флажок только в тех случаях, когда у вас еще нет данных или вы знаете, что существующие данные уже согласованы с этим ограничением, или вы не хотите по какой-либо причине, чтобы существующие данные были согласованы с ограничением. Но это может вызвать проблемы, если вы попытаетесь в дальнейшем обновить или удалить одну из существующих строк.
  5. Следующий флажок – это Enable relationship for replication (Активизировать связь для репликации). Не устанавливайте его, если вы не используете репликацию. Но даже если вы используете репликацию, вам все же не нужно устанавливать этот флажок, поскольку данные будут проверяться на согласованность с данным ограничением уже в исходных таблицах, поэтому их не обязательно проверять при репликации. Если вы все же активизировали связь для репликации и если расписания репликации этих двух таблиц не синхронизированы в достаточной степени, то вы получите ошибки во время репликации, указывающие, что какая-либо строка не может быть реплицирована, поскольку в ней нарушено ограничение по внешнему ключу.
  6. Следующий флажок – это Enable relationship for INSERT and UPDATE (Активизировать связь для операций INSERT и UPDATE). Установка этого флажка означает, что ограничение FOREIGN KEY будет проверяться при вставках и обновлениях, а также при удалениях. Если это является вашим намерением, установите данный флажок. Станут доступны два находящихся ниже флажка. Это флажки Cascade Update Related Fields (Каскадировать связанные с обновлением поля) и Cascade Delete Related Records (Каскадировать связанные с удалением записи). (Записью называется строка данных.)
    Вкладка Relationships, где показаны установленные флажки

    Рис. 16.17. Вкладка Relationships, где показаны установленные флажки
  7. Установка флажка Cascade Update Related Fields означает, что если вы обновляете ссылочную колонку ссылочной таблицы (например, обновляете значение колонки item_id в таблице items ), то это обновление будет каскадироваться в таблицу с внешним ключом. (В данном случае – то же самое значение колонки item_id будет обновлено, если оно имеется в таблице inventory.) Будет обновлено только значение данной колонки; остальная информация строки в таблице с внешним ключом останется без изменений. Установка этого флажка позволяет также выполнять обновление ссылочной колонки. Если вы не установите этот флажок, то система не позволит вам выполнить обновление ссылочной колонки, если она существует в таблице с внешним ключом. Вы получите от SQL Server сообщение об ошибке, аналогичное следующему: "UPDATE statement conflicted with COLUMN REFERENCE constraint "FK_inventory_items". The conflict occurred in database "MyDB", table "inventory", column "item_id". The statement has been terminated."

    (Конфликт оператора UPDATE с ограничением COLUMN REFERENCE "FK_inventory_items". Конфликт возник в базе данных "MyDB", таблица "inventory", колонка "item_id". Работа оператора прекращена.)

  8. Установка флажка Cascade Delete Related Records означает, что удаление из ссылочной таблицы будет каскадироваться в таблицу с внешним ключом. Например, если удаляется строка в таблице items, а строка в таблице inventory имеет в колонке item_id то же значение, что и удаленная строка, то эта строка также будет удалена из таблицы inventory. Это позволяет поддерживать согласованность вашей информации. Если вы не установите этот флажок, то система не позволит вам удалить строку из ссылочной таблицы, если на нее имеется ссылка в строке таблицы с внешним ключом. Вы получите сообщение об ошибке от SQL Server, аналогичное следующему: "DELETE statement conflicted with COLUMN REFERENCE constraint "FK_inventory_items". The conflict occurred in database "MyDB", table "inventory", column "item_id". The statement has been terminated."

    (Конфликт оператора DELETE с ограничением COLUMN REFERENCE "FK_inventory_items". Конфликт возник в базе данных "MyDB", таблица "inventory", колонка "item_id". Работа оператора прекращена.)

  9. После установки флажков щелкните на кнопке Close и затем щелкните на кнопке Save в окне Design Table для сохранения ваших изменений. Появится другое окно, информирующее, что перечисленные таблицы будут сохранены в вашей базе данных; в список входят две таблицы, связанные по внешнему ключу. Для завершения щелкните на кнопке Yes. Затем вы можете закрыть окно Design Table, щелкнув на кнопке Close в верхнем правом углу этого окна (но не окна Enterprise Manager, иначе вы закроете Enterprise Manager).

Существует другой метод, который можно использовать для создания или модифицирования ограничения FOREIGN KEY: использование схемы базы данных. Чтобы изучить создание и модифицирование ограничения FOREIGN KEY с помощью схемы базы данных, мы сформируем схему, используя те же две таблицы, что и в предыдущем примере: items и inventory. Сначала мы рассмотрим схему базы данных с этими таблицами без связи по внешнему ключу и затем добавим внешний ключ. Начальная схема базы данных показана на рис. 16.18).

 Схема базы данных для таблиц items и inventory

Рис. 16.18. Схема базы данных для таблиц items и inventory