SQL Server 2000

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

Разбить на страницы
Показывать лекцию целиком

Умолчания, ограничения и правила – это необязательные атрибуты, которые можно определять по колонкам и таблицам базы данных. В лекции 15 вы ознакомились с умолчаниями, когда описывалось добавление к таблице колонки со значением по умолчанию с помощью оператора ALTER TABLE. В этой лекции вы узнаете о двух методах создания и модифицирования умолчаний. Напоминаем, что умолчания (значения по умолчанию *) – это значения, которые заносятся в определенную колонку, когда не указано явно никакого значения. Ограничения (constraints)** используются как способ идентифицирования допустимых значений для колонки (чтобы отклонять недопустимые значения) а также как средство обеспечения целостности данных в таблицах базы данных и между связанными таблицами. Мы рассмотрим в этой лекции пять типов ограничений; вы также узнаете, как создавать и модифицировать умолчания и ограничения с помощью Transact-SQL (T-SQL) и Microsoft SQL Server Enterprise Manager, хотя использование Enterprise Manager часто оказывается проще.

Умолчания

Сначала рассмотрим причину, по которой вам может потребоваться использование умолчаний для определенных колонок таблицы; для этого мы посмотрим, что происходит, если вы не задали значение по умолчанию. Если в таблицу вводится строка, содержащая колонки без значений по умолчанию, и не во все колонки, допускающие null -значения, введены конкретные данные, то этим колонкам присваивается значение NULL. Но если колонка определена с атрибутом NOT NULL и вы не ввели какое-либо значение в эту колонку при вводе строки, то будет возвращено сообщение об ошибке, информирующее, что в эту колонку нельзя поместить значение NULL. Именно в этом случае удобно применять умолчания. Умолчания можно использовать, чтобы указывать определенное значение, которое будет помещено вместо значения NULL, и тогда вы не получите сообщения об ошибке. Вам следует использовать умолчания для колонок таблицы вместо разрешения использовать null -значения, поскольку операции по таким колонкам создают более высокую дополнительную нагрузку на систему, чем операции по колонкам, в которых не допускаются null -значения.

Microsoft SQL Server 2000 позволяет вам определять значение по умолчанию для каждой колонки таблицы. Вы не можете задать умолчание для колонок, имеющих тип данных timestamp или обладающих свойством IDENTITY или ROWGUIDCOL, поскольку эти колонки должны иметь уникальные значения. Колонки этого типа несовместимы со значениями по умолчанию, поскольку применение такого значения к колонке более одного раза приводило бы к тому, что колонка уже не имела бы уникальных значений. Вы можете присваивать только одно значение по умолчанию, и оно будет автоматически использоваться каждый раз, когда это требуется. И еще одно важное замечание относительно умолчаний: значение, задаваемое по умолчанию, должно быть совместимо с типом данных соответствующей колонки.

Значение по умолчанию можно создавать и модифицировать несколькими способами. В этом разделе мы рассмотрим, как определять значение по умолчанию при создании таблицы и как модифицировать колонку, чтобы добавлять или изменять умолчание, сначала – с помощью T-SQL и затем – с помощью Enterprise Manager. Напомним, что в лекции 15 мы рассматривали добавление колонок со значением по умолчанию и влияние этого значения на существующие строки. Вы увидите здесь менее подробный пример такой вставки. Мы также рассмотрим возможности и влияние вставки значения по умолчанию в существующую колонку таблицы.

Определение и модифицирование умолчаний с помощью T-SQL

Вы можете определять значение по умолчанию для колонки посредством одного из трех операторов T-SQL: CREATE TABLE, ALTER TABLE или CREATE DEFAULT. Оператор CREATE DEFAULT, который используется в SQL Server 2000 для совместимости с предыдущими версиями, создает объект типа Default (Default-объект). Если вы используете данный метод, SQL Server сохраняет этот объект отдельно от таблицы, поэтому вы должны выполнять привязку этого объекта к колонке или колонкам с помощью системной хранимой процедуры sp_bindefault. Если вы удаляете таблицу, определение DEFAULT автоматически теряет связь с этой таблицей, но сам Default -объект остается. Но если вы используете метод CREATE TABLE или ALTER TABLE, то SQL Server сохраняет определение DEFAULT вместе с таблицей и при удалении таблицы происходит автоматическое удаление этого умолчания без необходимости выполнения дополнительных шагов. По этой причине обычно рекомендуют не использовать оператор CREATE DEFAULT. Однако использование Default -объекта может оказаться полезным, если одно значение по умолчанию будет использоваться для нескольких колонок.

Для запуска ваших операторов T-SQL вам следует использовать анализатор запросов SQL Query Analyzer, поскольку результаты будут появляться в виде графического пользовательского интерфейса (GUI), что проще для чтения, чем при запуске операторов в окне командной строки.

Оператор CREATE TABLE с атрибутом DEFAULT

Создание умолчания для колонки с помощью оператора CREATE TABLE является предпочтительным, стандартным методом. Следующий оператор создает в базе данных MyDB таблицу, содержащую умолчания для обеих колонок, – columnA (типа char) и columnB (типа int):

USE MyDB
CREATE TABLE MyTable 
( 
columnA  		char(15) 		NULL DEFAULT 'n/a', 
columnB  		int      		NULL DEFAULT 0 
) 
GO

Значение по умолчанию n/a (сокращение от not applicable – неприменимо) для колонки columnA совместимо с типом данных char этой колонки, и значение по умолчанию 0 для колонки columnB совместимо с типом данных int . Если при вставке новой строки в таблицу не указывается конкретное значение для одной или обеих колонок, то используется соответствующее значение по умолчанию. Поэтому единственным способом присваивания этим колонкам значения NULL является явная вставка NULL. Null -значения допустимы, поскольку для обеих колонок указан атрибут NULL. Если бы колонки были определены как NOT NULL, то вы не могли бы выполнять явную вставку значения NULL.

Оператор ALTER TABLE с атрибутом DEFAULT

Чтобы изменить определение DEFAULT для колонки или добавить это определение к колонке, вы можете использовать оператор ALTER TABLE. Если значение по умолчанию уже определено и вам нужно изменить его с помощью этой команды, то вы должны сначала удалить существующее умолчание, указав его имя, и затем добавить новое умолчание. (При использовании Enterprise Manager вам не придется выполнять этот шаг, и это поможет вам понять, что использование Enterprise Manager является более простым методом. Изменив таблицу с помощью Enterprise Manager, вы можете также в любой момент генерировать сценарии для повторного создания таблицы.)

Предположим, что вы не хотите изменять существующее умолчание. Если вы создали умолчание с помощью оператора CREATE TABLE или с помощью Enterprise Manager (что будет описано ниже в этой лекции), но не присвоили имя самому умолчанию, то SQL Server присвоит имя автоматически. Чтобы выяснить, какое имя было присвоено умолчанию (имя используется для удаления умолчания с помощью T-SQL), вы можете запустить хранимую процедуру sp_help, указав имя таблицы, для которой задано это умолчание, как в следующем примере:

USE MyDB
GO
sp_help MyTable
GO

Имена всех ограничений default по таблице MyTable появятся в конце выводимых результатов в столбце под заголовком constraint_name (имя_ограничения) (рис. 16.1).

Предположим, что вы хотите изменить для колонки columnA значение по умолчанию n/a на значение not applicable. Напомним, что мы должны сначала удалить существующее умолчание и затем добавить новое. Чтобы удалить умолчание, используйте следующий оператор:

ALTER TABLE MyTable
DROP CONSTRAINT DF__MyTable__columnA__1920BF5CGO

С помощью следующего оператора мы можем теперь добавить новое умолчание, присвоив ему на этот раз имя:

ALTER TABLE MyTable
ADD CONSTRAINT DF_MyTable_columnA  
DEFAULT 'not applicable' FOR columnA 
GO

Если вы изменяете существующее умолчание по какой-либо колонке, для всех существующих строк в этой колонке остаются прежние значения, даже если это значение NULL. Новое значение по умолчанию будет использоваться только для новых строк.

(рис 16.1) Результаты работы хранимой процедуры sp_help
ALTER TABLE MyTable
ADD columnC tinyint 	NOT NULL DEFAULT 13 
GO

Теперь таблица MyTable содержит еще одну колонку, columnC, которая имеет значение по умолчанию 13. Поскольку columnC – новая колонка, определенная с атрибутом NOT NULL, этой колонке в уже существующих строках таблицы будет присвоено значение по умолчанию 13.

Если бы в новой колонке было разрешено использование значений NULL, то все существующие строки получили бы в новой колонке значение NULL. Если нужно, чтобы этой колонке было присвоено значение по умолчанию (вместо NULL), то в предложении DEFAULT нужно использовать параметр WITH VALUES, как это показано ниже:

ALTER TABLE MyTable
ADD columnC tinyint 	NULL DEFAULT 13 WITH VALUES 
GO

При использовании WITH VALUES новой колонке во всех существующих строках таблицы MyTable будет присвоено значение 13 (вместо значения NULL ).

Теперь, когда вы знаете, как создавать определение DEFAULT, которое сохраняется вместе с таблицей, рассмотрим использование оператора CREATE DEFAULT. С помощью этого метода создается Default -объект, который хранится отдельно от таблицы.

Оператор CREATE DEFAULT и процедура sp_bindefault

Вы можете также добавить умолчание к существующей колонке или изменить умолчание по колонке, создав сначала Default-объект с помощью оператора T-SQL CREATE DEFAULT. Создав Default-объект, вы можете затем связать его с колонкой или с определенным пользователем типом данных, используя системную хранимую процедуру sp_bindefault. Как уже говорилось, этот метод остался в SQL Server 2000 только для обратной совместимости; он не является предпочтительным методом, но может оказаться полезным, если вы будете использовать одно значение по умолчанию для колонок нескольких таблиц.

Рассмотрим пример использования оператора CREATE DEFAULT для создания Default-объекта с именем DF_not_applicable и значением n/a. Это умолчание будет создано в базе данных MyDB и затем будет связано с колонкой columnA таблицы MyTable (в предположении, что для этой таблицы не существует никаких умолчаний). Оператор CREATE DEFAULT имеет следующий синтаксис:

CREATE DEFAULT имя_умолчания AS выражение-константа
Процедура sp_bindefault имеет следующий синтаксис:
sp_bindefault 'имя_умолчания', таблица.колонка | определенный_пользователем_тип_данных
[, futureonly]

Параметр имя_умолчания – это имя Default-объекта. Параметр таблица.колонка указывает колонку, которой вы хотите присваивать это умолчание.

С помощью следующих операторов T-SQL создается Default-объект и происходит его привязка к колонке columnA таблицы MyTable:

USE MyDB
GO 
CREATE DEFAULT DF_not_applicable AS 'n/a' 
GO 
sp_bindefault 'DF_not_applicable', 'MyTable.columnA' 
GO

Если для колонки columnA уже задано значение по умолчанию, то SQL Server возвратит сообщение об ошибке, информирующее вас, что вы не можете выполнить привязку умолчания к колонке, для которой уже задано какое-либо умолчание. Удалите сначала это умолчание и затем выполните привязку нового умолчания к данной колонке. (Процесс использования оператора DROP DEFAULT для удаления Default-объекта описывается ниже в этом разделе.)

Вы можете также создать Default-объект и выполнить его привязку непосредственно к определенному пользователем типу данных. Любая колонка, которой присваивается этот конкретный тип данных, наследует данное умолчание автоматически. Вы можете использовать при обращении к процедуре sp_bindefault необязательный параметр futureonly, когда выполняете привязку Default-объекта к определенному пользователем типу данных. Этот параметр препятствует тому, чтобы существующие колонки, имеющие этот определенный пользователем тип данных, наследовали новое умолчание; тем самым только новые колонки с этим типом данных будут наследовать это умолчание. Если параметр futureonly не указан, то SQL Server выполнит привязку ко всем существующим и вновь создаваемым колонкам, имеющим определенный пользователем тип данных.

Например, создадим определенный пользователем тип данных с именем area_code (код_района) и Default-объект с именем DF_area_code и значением 786; тем самым будет выполнена привязка этого умолчания к определенному пользователем типу данных. (О создании определенных пользователем типов данных см. лекцию 10.) Это новый определенный пользователем тип данных, т.е. еще нет колонок с этим типом данных, поэтому параметр futureonly не требуется. Тем не менее мы включим его, чтобы показать его синтаксис, хотя это не окажет никакого влияния. Ниже показаны соответствующие операторы:

sp_addtype 'area_code', 'char(3)', 'NOT NULL'
GO 

CREATE DEFAULT DF_area_code AS 786 
GO 

sp_bindefault 'DF_area_code', 'area_code', 'futureonly' 
GO

Чтобы увидеть на экране этот тип данных и присвоенное ему значение по умолчанию, используйте системную хранимую процедуру sp_help (рис. 16.2).

(рис 16.2) Результаты Query Analyzer для процедуры sp_help

Процедура sp_unbindefault

Чтобы аннулировать привязку Default-объекта к колонке или определенному пользователем типу данных, используйте процедуру sp_unbindefault, указав имя таблицы и имя колонки или имя определенного пользователем типа данных. Например, для аннулирования привязки Default-объекта DF_not_applicable к колонке columnA таблицы MyTable используйте следующий оператор:

sp_unbindefault 'MyTable.columnA'
GO

Для аннулирования привязки умолчания к определенному пользователем типу данных area_code используйте следующий оператор:

sp_unbindefault 'area_code'
GO

После этого все колонки, которым был присвоен определенный пользователем тип данных area_code, уже не обладают свойством использования умолчания.

Вы можете выполнить привязку Default-объекта к более чем одной колонке с помощью отдельных операторов sp_bindefault. Кроме того, отменив привязку умолчания к колонке, вы можете снова выполнить его привязку, пока не удалили сам Default-объект. Чтобы удалить Default-объект, используйте оператор DROP DEFAULT, как это показано ниже:

DROP DEFAULT DF_area_code
GO

После удаления Default-объекта он уже недоступен. Если вам нужно использовать его снова, вы должны применить оператор CREATE DEFAULT для повторного создания этого объекта.

Определение и модифицирование умолчаний с помощью Enterprise Manager

Как вы уже видели в лекции 15, использование Enterprise Manager – это, видимо, наиболее простой способ создания, просмотра и модифицирования таблиц вашей базы данных. При создании или модифицировании таблицы или колонки с помощью Enterprise Manager система SQL Server автоматически берет на себя исполнение соответствующих команд T-SQL, выполняя эту работу за вас. (Пошаговые инструкции по созданию таблицы с помощью Enterprise Manager см. в лекции 10.) В этом разделе мы рассмотрим особенности использования Enterprise Manager для присваивания и модифицирования умолчания по колонке и создания Default-объекта. Это предпочтительный метод работы. Начнем с примеров присваивания и модифицирования умолчаний.

Присваивание и модифицирование умолчаний

Предположим, у нас имеется таблица с именем Product_Info в базе данных MyDB (рис. 16.3). (Инструкции по созданию этой таблицы с помощью Enterprise Manager см. в лекции 10.)

Чтобы определить умолчание, просто щелкните на имени колонки, которой хотите присвоить это умолчание, и введите значение по умолчанию в поле Default Value (Значение по умолчанию) вкладки Columns (Колонки) внизу окна. На рис. 16.3 колонке Description (Описание) присвоено значение по умолчанию "n/a"; это может быть значение-заполнитель, указывающее, что описание продукта еще не известно. Кроме того, значение по умолчанию заключено в круглые скобки – Enterprise Manager добавляет их автоматически, когда вы сохраняете таблицу.

Изменение значения по умолчанию происходит столь же просто. Замените исходное значение по умолчанию новым значением по умолчанию и сохраните свою работу, щелкнув на кнопке Save (Сохранить). На рис. 16.4 показано, что значение по умолчанию колонки Description изменено на "not available"; на рис. 16.5 показано умолчание "general merchandise" (обычные товары), добавленное к колонке Product_Name (Имя_продукта).

(рис 16.3) Окно Design Table (Разработка таблицы) для таблицы Product_InfoПримечание. Вводя символьную строку для значения по умолчанию, вы должны заключить ее в апострофы, иначе SQL Server выдаст сообщение об ошибке, когда вы попытаетесь сохранить соответствующее изменение.

Когда вы создаете или изменяете умолчание для существующей колонки с помощью Enterprise Manager, то, как и при использовании T-SQL, это не влияет на существующие строки таблицы: новое значение по умолчанию используется только при вставке новых строк. Если вы добавляете к таблице новую колонку и присваиваете ей значение по умолчанию, то в существующих строках данных этой колонке присваивается значение по умолчанию только в том случае, если не разрешено использование значений NULL. В противном случае эта новая колонка получит в существующих строках значение NULL. Чтобы разрешить использование значений NULL для новой колонки со вставкой значения по умолчанию в эту колонку для всех существующих строк, используйте метод, описанный в разделе "Оператор ALTER TABLE с атрибутом DEFAULT" выше в этой лекции.

(рис 16.5) Окно Design Table, где показано измененное значение по умолчанию(рис 16.4) Окно Design Table, где показано добавленное значение по умолчанию

Создание Default-объектов и управление этими объектами

Вы можете также создавать Default-объект и просматривать существующие Default-объекты с помощью Enterprise Manager. Для просмотра существующих Default-объектов откройте Enterprise Manager, раскройте сервер и базу данных, которые хотите использовать, и щелкните на папке Defaults. Все существующие Default-объекты появятся в правой панели (рис. 16.6). Отметим, что показаны умолчания DF_not_applicable и DF_area_code, которые мы создали выше в этой лекции с помощью оператора CREATE DEFAULT.

(рис 16.6) Просмотр существующих Default-объектов

Чтобы создать новый Default-объект и выполнить привязку этого умолчания к колонке или определенному пользователем типу данных с помощью Enterprise Manager, выполните следующие шаги.

  • Раскройте сервер и базу данных, щелкните правой кнопкой мыши на Defaults и выберите из контекстного меню пункт New Default (Создать умолчание), чтобы появилось окно Default Properties (Свойства умолчания) (рис. 16.7). Мы присвоим Default-объекту имя DF_none и значение "none". По окончании щелкните на кнопке OK.
  • Для привязки вашего умолчания к определенному пользователем типу данных или к колонке щелкните правой кнопкой мыши в правой панели Enterprise Manager на имени этого умолчания (в данном случае – Щелкните на кнопке Bind UDTs, чтобы появилось диалоговое окно Bind Default to User-defined Data Types (Привязка умолчания к определенным пользователем типам данных) (рис 16.8(рис 16.8) Окно Default Properties (Свойства умолчания)(рис 16.7) Диалоговое окно Bind Default to User-defined Data Types (Привязка умолчания к определенным пользователем типам данных)
  • Для привязки умолчания к колонке щелкните на пункте Bind Columns (Привязка к колонкам), чтобы появилось диалоговое окно Bind Default to Columns (Привязка умолчания к колонкам). Теперь выберите колонку, с которой хотите связать данное умолчание. Сначала выберите имя таблицы в раскрывающемся списке Table (Таблица). Затем в списке Unbound Columns (Колонки без привязки) выберите имя колонки, с которой хотите связать умолчание. Затем щелкните на кнопке Add (Добавить). На рис 16.9(рис 16.9) Диалоговое окно Bind Default to Columns (Привязка умолчания к колонкам))
  • Щелкните на кнопке OK, чтобы вернуться в окно Default Properties, и щелкните на кнопке OK еще раз, чтобы закрыть окно Default Properties.
  • Чтобы отменить привязку Default-объект а к определенному пользователем типу в окне Default Properties, откройте диалоговое окно Bind Default to User-defined Data Types, как это описано выше, и просто сбросьте флажок Bind. Чтобы отменить привязку Default-объект а к колонке, откройте диалоговое окно Bind Default to Columns, выделите имя этой колонки и затем щелкните на кнопке Remove (Удалить).

    Чтобы удалить Default-объект, вы должны сначала отменить привязку этого умолчания ко всем другим объектам (как только что было описано). SQL Server возвратит сообщение об ошибке, если вы попытаетесь удалить умолчание, которое привязано к одному или нескольким объектам. Для удаления Default-объект а щелкните на папке Defaults в левой панели Enterprise Manager, щелкните правой кнопкой мыши на имени этого Default-объект а, выберите из контекстного меню пункт Delete и затем щелкните на кнопке Drop All (Удалить все) в появившемся диалоговом окне Drop Objects (Удаление объектов).

    Ограничения

    Ограничения автоматически обеспечивают целостность данных. Ограничения задают правила, которые определяют значения данных, допустимые для какой-либо колонки. Они позволяют ограничивать значения данных, которые вводятся в колонку, чтобы в этой колонке не оказались неверные значения. Например, с помощью ограничения вы можете ограничить значения колонки целого типа диапазоном от 1 до 100. В результате любые значения вне этого диапазона нельзя будет ввести в данную колонку. (Для создания этого диапазона вы можете использовать ограничение CHECK, как будет показано ниже.) Ограничение только по одной колонке называется ограничением колонки ; оно ограничивает значения только этой колонки. Ограничение, которое влияет на несколько колонок, называется ограничением таблицы, или табличным ограничением; в этом случае комбинация значений для колонок, указанных в данном ограничении, должна отвечать требованиям этого ограничения. Имеется пять типов ограничений: NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY и CHECK.

    Создание и модифицирование ограничений с помощью T-SQL

    В этом разделе вы узнаете об использовании каждого типа ограничений и реализации ограничений с помощью T-SQL. В следующем разделе вы узнаете, как реализовывать ограничения с помощью Enterprise Manager.

    Ограничение NOT NULL

    Ограничение NOT NULL является довольно простым, и мы уже видели, как оно использовалось в примерах этой лекции и предыдущих лекций. Ограничение NOT NULL задается в описании колонки, чтобы воспрепятствовать вставке null -значений в эту колонку (в противоположность ограничению NULL, которое разрешает присваивать null -значения). При использовании T-SQL вы можете указать NOT NULL при создании таблицы или позже, когда будете модифицировать какую-либо колонку. (О модифицировании таблиц базы данных см. лекцию 10.) Вам следует использовать NOT NULL вместо NULL там, где это возможно, поскольку операции с null -значениями, такие как сравнения, сопряжены с большей дополнительной нагрузкой при обработке. Как уже говорилось выше в этой лекции, лучше использовать значение по умолчанию там, где это возможно, чем разрешать вставку null -значений.

    Ограничение UNIQUE

    Ограничение UNIQUE обеспечивает, что в колонке или наборе колонок не будут допускаться дублированные значения; иными словами, обеспечивается уникальность значений в этой колонке или наборе колонок. Для поддержки этой уникальности SQL Server создает по умолчанию уникальный некластеризованный индекс по колонке или колонкам, указанным в ограничении UNIQUE. Вы можете, однако, указывать, каким должен быть этот индекс – кластеризованным или некластеризованным. Напомним, что таблица может иметь только один кластеризованный индекс.

    Примечание. Вы будете часто встречать в этой лекции термины "кластеризованный индекс" и "некластеризованный индекс". Не беспокойтесь, если вы не совсем понимаете, что означают эти термины, – в лекции 17 дается подробное описание этих типов индексов.

    Ограничение UNIQUE можно использовать для любой колонки, которая не является частью ограничения PRIMARY KEY (описывается в следующем разделе), которое также обеспечивает уникальность значений. Ограничение UNIQUE можно использовать для колонок, в которых разрешены null -значения, в то время как ограничения PRIMARY KEY нельзя использовать для таких колонок. Null -значения не затрагиваются ограничениями UNIQUE. На колонку с ограничением UNIQUE может ссылаться ограничение FOREIGN KEY (см. раздел "Ограничение FOREIGN KEY" далее). По одной таблице можно задавать несколько ограничений UNIQUE, пока общее число индексов для этой таблицы не превышает 249 некластеризованных и одного кластеризованного индекса.

    Чтобы создать ограничение UNIQUE по таблице с помощью T-SQL, используйте оператор CREATE TABLE или ALTER TABLE. Например, следующий оператор создает таблицу customer (покупатель) с ограничением UNIQUE по колонке SSN в виде кластеризованного индекса:

    CREATE TABLE customer
    (
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11) 	NOT NULL UNIQUE CLUSTERED, 
    cust_phone   		char(10) 	NULL 
    ) 
    GO

    В этом операторе CREATE использовано ограничение по колонке. В следующем примере снова создается таблица, но на этот раз с добавлением табличного ограничения UNIQUE с именем UQ_full_name по колонкам first_name, mid_init и last_name:

    CREATE TABLE customer
    ( 
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11) 	NOT NULL UNIQUE CLUSTERED, 
    cust_phone   		char(10) 	NULL, 
    CONSTRAINT   	UQ_full_name UNIQUE NONCLUSTERED (first_name,  
        				mid_init, last_name) 
    ) 
    GO

    Табличное ограничение UNIQUE (ограничение по более чем одной колонке) обеспечивает уникальность комбинаций значений по соответствующим колонкам. В данном случае в базу данных нельзя ввести двух покупателей, имеющих одинаковое сочетание имени (first_name), фамилии (last_name) и инициала отчества (mid_init). В одной или двух колонках может встретиться одинаковая комбинация, но не во всех трех колонках. Отметим, что в данном случае табличное ограничение UNIQUE является некластеризованным индексом, поскольку у нас уже имеется уникальный кластеризованный индекс по колонке SSN.

    Чтобы добавить ограничение UNIQUE к существующей таблице, используйте оператор ALTER TABLE. Если вы пытаетесь модифицировать существующую колонку или колонки, добавляя ограничение UNIQUE, все существующие строки данной таблицы должны содержать уникальные значения или null -значения в этой колонке или колонках, иначе вы получите сообщение об ошибке и ограничение UNIQUE не будет добавлено. Предположим, что мы создали таблицу customer без каких-либо ограничений. Ниже приводятся два оператора для добавления ограничений по колонке и по таблице:

    ALTER TABLE customer 
    ADD CONSTRAINT UQ_ssn UNIQUE CLUSTERED (SSN) 
    GO
    
    ALTER TABLE customer 
    ADD CONSTRAINT UQ_full_name UNIQUE NONCLUSTERED (first_name, mid_init, last_name) 
    GO

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

    Чтобы изменить существующее ограничение UNIQUE по какой-либо колонке или таблице с помощью T-SQL, вы должны сначала удалить соответствующее ограничение и затем снова создать его. Как и для умолчаний, вам следует использовать для ваших ограничений описательные имена, чтобы вы могли легко находить и удалять их без необходимости выяснения имен, присвоенных им системой SQL Server. При изменении ограничения с помощью Enterprise Manager система SQL Server автоматически удаляет старое ограничение и вновь создает его, когда вы сохраняете выполненные изменения (см. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее).

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

    Ограничение PRIMARY KEY используется, чтобы задать первичный ключ таблицы, представляемый колонкой или набором колонок, уникальным образом идентифицирующих строку таблицы. Поскольку первичный ключ идентифицирует строку, соответствующая колонка никогда не содержит значения NULL. В этом состоит отличие ограничения PRIMARY KEY от ограничения UNIQUE, которое допускает null-значения. Если вы определяете ограничение PRIMARY KEY по набору колонок, это ограничение указывает, что комбинация значений этих колонок должна быть уникальной для каждой строки, что аналогично ограничению UNIQUE по набору колонок. И, подобно ограничению UNIQUE, ограничение PRIMARY KEY не допускает дублированных значений. Если ограничение PRIMARY KEY присваивается колонке или набору колонок, то по этой колонке или колонкам первичного ключа автоматически создается уникальный индекс. Вы можете также задать для первичного ключа кластеризованный или некластеризованный индекс; если ничего не задано, по умолчанию создается кластеризованный индекс, если таблица еще не имеет кластеризованного индекса.

    Таблица может иметь только одно ограничение PRIMARY KEY. Колонка с атрибутом IDENTITY хорошо подходит для первичного ключа, как и любая другая колонка или набор колонок, являющиеся уникальными для каждой строки. Например, в примере нашей таблицы customer мы могли бы создать колонку SSN как первичный ключ вместо создания для нее ограничения UNIQUE. Ограничение PRIMARY KEY не допускало бы null -значений и обеспечивало бы уникальность значений в колонке SSN, а по этой колонке первичного ключа был бы автоматически создан кластеризованный индекс. Следующий оператор T-SQL представляет один из способов задания колонки SSN как первичного ключа, когда вы определяете таблицу. При этом способе имя ограничению PRIMARY KEY присваивает SQL Server, поэтому он не является предпочтительным методом, так как в дальнейшем вам может потребоваться удаление данного ключа по имени.

    CREATE TABLE 	customer
    ( 
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11) 	PRIMARY KEY, 
    cust_phone   		char(10) 	NULL 
    ) 
    GO

    Используя альтернативный способ, вы можете присвоить имя этому ограничению, добавив ключевое слово CONSTRAINT. Чтобы присвоить имя PK_SSN вашему ограничению PRIMARY KEY, используйте следующий оператор:

    CREATE TABLE 	customer
    ( 
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11) 	CONSTRAINT PK_SSN PRIMARY KEY, 
    cust_phone   		char(10) 	NULL 
    ) 
    GO

    Вы можете также задать ограничение PRIMARY KEY после того, как определены все колонки таблицы. При использовании этого синтаксиса имя колонки должно быть заключено в круглые скобки и указано после предложения CONSTRAINT, как это показано в следующем операторе:

    CREATE TABLE 	customer
    ( 
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11), 
    cust_phone   		char(10) 	NULL, 
    CONSTRAINT PK_SSN PRIMARY KEY (SSN) 
    ) 
    GO

    Чтобы добавить ограничение PRIMARY KEY к таблице, не имеющей ограничения PRIMARY KEY, используйте оператор ALTER TABLE. Следующий оператор добавляет ограничение PRIMARY KEY к таблице customer:

    ALTER TABLE 	customer
    ADD CONSTRAINT PK_SSN PRIMARY KEY CLUSTERED (SSN) 
    GO

    Здесь мы включили необязательное ключевое слово CLUSTERED, чтобы просто разъяснить, что по колонке первичного ключа будет создан кластеризованный индекс, хотя это происходит по умолчанию.

    Чтобы удалить ограничение PRIMARY KEY, используйте оператор ALTER TABLE с предложением DROP CONSTRAINT. Ниже мы удаляем ограничение по колонке SSN:

    ALTER TABLE customer
    DROP CONSTRAINT PK_SSN
    GO

    Отметим, что для предложения DROP CONSTRAINT требуется только имя данного ограничения. Чтобы изменить существующее ограничение PRIMARY KEY по таблице с помощью операторов T-SQL, вы должны сначала удалить существующее ограничение и затем выполнить изменение таблицы, добавив новое ограничение. Это выполняется с помощью операторов ALTER TABLE...DROP CONSTRAINT и ALTER TABLE...ADD CONSTRAINT.

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

    Ограничение FOREIGN KEY определяет внешний ключ который задает связь между двумя таблицами. Колонка или колонки внешнего ключа одной таблицы ссылаются на потенциальный ключ (одна или несколько колонок) в другой таблице. При вставке строки в таблицу с ограничением FOREIGN KEY значения, которые должны быть внесены в колонку или колонки, определенные как внешний ключ, сравниваются со значениями в потенциальном ключе ссылочной таблицы. Если ни одна из строк ссылочной таблицы не соответствует значениям во внешнем ключе, то вставка новой строки не выполняется. Но если значения внешнего ключа, которые нужно внести в таблицу, все же имеются в потенциальном ключе другой таблицы, то вставка новой строки будет выполнена. Если значение, которое должно быть занесено в таблицу с ограничением FOREIGN KEY, равно NULL, то это тоже допустимо.

    Проверка ограничений FOREIGN KEY происходит также в тех случаях, когда вы хотите обновить какую-либо строку в ссылочной таблице или в таблице с внешним ключом. Вы не сможете обновить какое-либо значение потенциального ключа или внешнего ключа, если это приведет к нарушению ограничения. Существует одно исключение из этого правила, когда вы обновляете ссылочную таблицу с помощью опции ON UPDATE CASCADE оператора T-SQL CREATE TABLE. (См. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее.) Кроме того, ограничения FOREIGN KEY проверяются, если вы хотите удалить какую-либо строку из ссылочной таблицы. Вы не сможете удалить строку из ссылочной таблицы, если строка какой-либо таблицы с внешним ключом (таблицы, содержащей ограничение FOREIGN KEY ) содержит ссылку на значение в колонке внешнего ключа.

    Иными словами, для каждой строки в таблице с внешним ключом должна существовать соответствующая строка в ссылочной таблице, и эту строку нельзя удалить, пока на нее имеется ссылка. Существует также исключение из этого правила: вы можете удалить строку из ссылочной таблицы с помощью опции ON DELETE CASCADE оператора T-SQL CREATE TABLE.(См. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее.)

    Внешний ключ может ссылаться только на те колонки, которые содержат в ссылочной таблице ограничение PRIMARY KEY или UNIQUE. Если вы попытаетесь создать внешний ключ, который ссылается на колонку, не являющуюся частью одного из этих ограничений, то SQL Server возвратит сообщение об ошибке. Кроме того, тип данных и размер колонки или колонок внешнего ключа должны совпадать со ссылочной колонкой или колонками.

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

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

    Затем мы создадим таблицу с именем inventory, содержащую ограничение FOREIGN KEY с именем FK_item_id, которое ссылается на колонку item_id в таблице items, как в следующем операторе:

    CREATE TABLE 	inventory
    ( 
    store_id        	tinyint    	NOT NULL, 
    item_id         	smallint   	NOT NULL,  
    item_quantity   	tinyint    	NOT NULL, 
    CONSTRAINT      	FK_item_id 	FOREIGN KEY (item_id)  
    REFERENCES      	items(item_id) 
    ) 
    GO

    Чтобы увидеть, каким образом связаны эти таблицы, мы создадим схему (диаграмму) базы данных (рис. 16.10). (Инструкции по созданию схемы базы данных см. в лекции 15.) В данном примере items – это ссылочная таблица с потенциальным ключом item_id. Это единственно возможный потенциальный ключ, поскольку он является первичным ключом в данной таблице и эта таблица не содержит никаких ограничений UNIQUE. Напомним, что только колонки первичного ключа и колонки с ограничениями UNIQUE является допустимыми потенциальными ключами. Таблица inventory содержит ограничение FOREIGN KEY, определенное по ее колонке item_id. С помощью этого ограничения создается связь по внешнему ключу между этими двумя таблицами. Обе связанные колонки имеют тип данных smallint. Ограничение FOREIGN KEY в таблице inventory по колонке item_id гарантирует, что в колонку item_id нельзя ввести никакое значение, если этого значения нет в колонке item_id таблицы items. Иными словами, если товар отсутствует в таблице items, то он не может присутствовать в таблице inventory. Кроме того, из таблицы items нельзя удалить строку, если на нее имеется ссылка из какой-либо строки в таблице inventory. Иными словами, если какой-либо товар присутствует в таблице items и таблице inventory, этот товар нельзя удалить из таблицы items, пока он присутствует в таблице inventory. Теперь вы, вероятно, поняли, что внешние ключи используются для поддержки согласованности базы данных. Например, в данном случае вам не нужна информация о допустимости какого-либо товара в таблицах, если не существует записи об этом товаре в таблице items, предназначенной для хранения записей по каждому имеющемуся товару.

    (рис 16.10) Схема базы данных, где показана связь по внешнему ключу между таблицами items и inventory

    Чтобы модифицировать ограничение FOREIGN KEY с помощью операторов T-SQL, вы должны сначала удалить старое ограничение и затем создать новое с помощью оператора ALTER TABLE. Этот метод действует аналогично модифицированию ограничения PRIMARY KEY. Ниже приводятся операторы для удаления исходного ограничения по таблице inventory и последующего добавления нового ограничения:

    ALTER TABLE inventory
    DROP CONSTRAINT FK_item_id 
    GO 
    
    ALTER TABLE inventory 
    ADD CONSTRAINT FK_item_id FOREIGN KEY (item_id)  
    REFERENCES items(item_id) 
    GO

    Если вы добавляете ограничение FOREIGN KEY к существующей колонке таблицы, SQL Server проверяет существующие строки таблицы, чтобы убедиться в том, что для значений этой колонки (за исключением null -значений) имеются соответствующие значения в колонке с ограничением PRIMARY KEY или UNIQUE ссылочной таблицы. Чтобы создать ограничение FOREIGN KEY без проверки системой SQL Server совпадения с существующими значениями, вы должны использовать опцию WITH NOCHECK оператора ALTER TABLE, как это показано ниже:

    ALTER TABLE inventory
    WITH NOCHECK ADD CONSTRAINT FK_item_id  
    FOREIGN KEY (item_id) 
    REFERENCES items(item_id) 
    GO

    Опция WITH NOCHECK препятствует тому, чтобы SQL Server проверял существующие строки таблицы, и это позволяет добавить соответствующее ограничение к таблице независимо от существующих значений. После добавления этого ограничения SQL Server обеспечивает целостность по внешнему ключу для новых строк.

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

    Вы можете также активизировать или отключать использование ограничения FOREIGN KEY. Если вы хотите ввести строку, которая не согласуется с существующим ограничением, то можете временно отключить это ограничение, ввести строку и затем снова активизировать ограничение. Ключевое слово NOCHECK указывает, что данное ограничение следует игнорировать (отключить), а ключевое слово CHECK указывает, что ограничение следует активизировать. Следующие операторы выполняют отключение и повторную активизацию ограничения FOREIGN KEY с помощью ключевых слов NOCHECK и CHECK:

    ALTER TABLE inventory
    NOCHECK CONSTRAINT FK_item_id    	--Отключает ограничение
    GO
    
    —Здесь должен быть оператор INSERT
    GO
    
    ALTER TABLE inventory          
    CHECK CONSTRAINT FK_item_id      	--Повторно активизирует ограничение
    GO
    Внимание. Вам не следует выполнять вставку строки данных, не согласующейся с ограничением FOREIGN KEY, если это не является крайней необходимостью. Если вы все же сделаете это, то, возможно, не сможете выполнять дальнейшие обновления.

    Ограничение CHECK

    Ограничение CHECK используется, чтобы ограничить множество допустимых для колонки значений определенными значениями. Значения, которые используются при вставке в колонку или обновлении колонки, проверяются на истинность (значение TRUE ) указанного в ограничении булева условия поиска. Например, если бы нам нужно было ограничить диапазон возможных значений, допустимых для колонки price (цена) таблицы items, величинами от $0,01 до $500,00, то мы использовали бы следующий оператор:

    CREATE TABLE items
    ( 
    item_name   		char(15)    	NOT NULL, 
    item_id     		smallint    	NOT NULL IDENTITY(1,1), 
    price       		smallmoney  	NULL, 
    item_desc   		varchar(30) 	NOT NULL DEFAULT 'none', 
    CONSTRAINT  	PK_item_id  	PRIMARY KEY (item_id), 
    CONSTRAINT  	CK_price    	CHECK (price >= .01 AND  
        						price <= 500.00) 
    ) 
    GO

    Отметим, что мы разрешили использование значений NULL в колонке price и задали ограничение CHECK по этой колонке. Поскольку SQL Server может отличить null -значение от любого другого типа значений, в колонке price, несмотря на ограничение CHECK, разрешены значения NULL. Кроме того, отметим, что мы присвоили этому ограничению имя CK_price. Как мы уже видели, присваивание имени ограничению упрощает последующее удаление и повторное создание этого ограничения по имени с помощью T-SQL. Например, чтобы изменить множество допустимых значений на диапазон от $1,00 до $1000,00, используйте следующий оператор:

    ALTER TABLE items
    DROP CONSTRAINT CK_price 
    GO 
     
    ALTER TABLE items 
    ADD CONSTRAINT CK_price CHECK (price >= 1.00 AND  
        	 price <= 1000.00) 
    GO

    Второй оператор ALTER TABLE имел бы такой же вид, если бы вы добавляли это ограничение к существующей таблице items в первый раз. При добавлении ограничения CHECK к существующей таблице применяются те же правила, что и при добавлении ограничения FOREIGN KEY. Существующие строки будут проверяться на соответствие этому ограничению. Если не все строки дают при проверке значение TRUE, то ограничение не добавляется к таблице и SQL Server возвращает сообщение об ошибке, информирующее, что оператор ALTER TABLE создает конфликтную ситуацию из-за ограничения CHECK. Если вы все же должны добавить это ограничение, используйте опцию WITH NOCHECK, чтобы указать, что должны проверяться только последующие обновления и добавляемые строки, но не существующие строки.

    Внимание. Использование опции WITH NOCHECK не рекомендуется, так как последующие обновления, возможно, не будут выполняться для строки, не согласующейся с ограничением.

    Вот пример использования WITH NOCHECK при добавлении ограничения CK_price:

    ALTER TABLE items
    WITH NOCHECK ADD CONSTRAINT CK_price  
    CHECK (price >= 1.00 AND price <= 1000.00) 
    GO

    Вы можете также активизировать и отключать ограничение CHECK (как и ограничение FOREIGN KEY ) с помощью ключевых слов CHECK и NOCHECK, используемых с командой ALTER TABLE. Вам может потребоваться этот метод, например, для вставки цены, выходящей за указанный диапазон. В следующем примере выполняется отключение и последующая повторная активизация ограничения CHECK с именем CK_price:

    ALTER TABLE items
    NOCHECK CONSTRAINT CK_price    	--Отключает ограничение     
    GO 
     
    --Здесь должен быть оператор INSERT
    GO 
    
    ALTER TABLE items
    CHECK CONSTRAINT CK_price      	--Повторно активизирует ограничение
    GO
    Примечание. CHECK и FOREIGN KEY – это единственные типы ограничений, которые можно отключать и активизировать таким способом.

    Создание и модифицирование ограничений с помощью Enterprise Manager

    В этом разделе вы узнаете, как создавать, модифицировать и удалять ограничения в Enterprise Manager с помощью окна Design Table и (в случае ограничений FOREIGN KEY ) с помощью схемы базы данных. (Инструкции по созданию схемы базы данных см. в лекции 15.) Окно Design Table появляется, когда вы создаете или редактируете таблицу с помощью Enterprise Manager. Чтобы создать таблицу, раскройте в левой панели Enterprise Manager папку сервера и папку базы данных, щелкните правой кнопкой мыши на папке Tables (Таблицы) и затем выберите из контекстного меню пункт New Table (Создать таблицу). Чтобы появилось окно Design Table для какой-либо существующей таблицы, сначала щелкните на папке Tables, щелкните правой кнопкой мыши на имени этой таблицы в правой панели и затем выберите из контекстного меню пункт Design Table.

    Разрешение использовать null-значения

    Чтобы указать, можно или нельзя использовать null -значения в какой-либо колонке, просто установите или сбросьте соответствующий флажок в колонке Allow Nulls (Разрешить null -значения) окна Design Table. Вы можете задать этот параметр при создании таблицы или при ее модифицировании. (Правила для разрешения null -значений см. в лекции 10.) На рис. 16.11 показано окно Design Table для таблицы customer (см. раздел "Создание и модифицирование ограничений с помощью T-SQL" выше в этой лекции). Как видно из рисунка, null -значения допускаются в колонках mid_init и cust_phone, но в остальных трех колонках не допускаются.

    (рис 16.11) Окно Design Table для таблицы customer с установленными флажками в столбце Allow Nulls.

    Ограничение UNIQUE

    Чтобы создать или модифицировать ограничение UNIQUE с помощью Enterprise Manager, выполните следующие шаги:

  • В панели инструментов окна Design Table щелкните на кнопке Table аnd Index Properties (Свойства таблицы и индексов) (кнопка справа от кнопки Save) и затем щелкните на вкладке Indexes/Keys (Индексы/Ключи) в появившемся окне Properties (Свойства). На рис. 16.12 показана вкладка Indexes/Keys окна Properties для таблицы customer. В этой вкладке будут представлены любые ограничения UNIQUE, поскольку они реализуются в виде уникальных индексов.

    Данная таблица создана с помощью следующего оператора, содержащего ограничение UNIQUE в виде кластеризованного индекса по колонке SSN. (SQL Server автоматически присвоил этому индексу имя UQ_customer_398D8EEE; именно поэтому удобнее присваивать ваши собственные имена ограничениям и индексам.)

    CREATE TABLE customer
    (
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11) 	NOT NULL UNIQUE CLUSTERED, 
    cust_phone   		char(10) 	NULL 
    ) 
    GO
    (рис 16.12) Вкладка Indexes/Keys окна Properties для таблицы customer
  • Создание нового ограничения UNIQUE начните со щелчка на кнопке New (Создать) вкладки Indexes/Keys окна Properties. Выберите имена колонок, которые хотите включить в ограничение, введите имя этого нового ограничения и затем установите флажок Create UNIQUE (Создать ограничение UNIQUE ). Установите флажок Create As CLUSTERED (Создать как кластеризованный индекс), если вы хотите, чтобы это был кластеризованный индекс по данной таблице, и задайте, если хотите, коэффициент заполнения (поле Fill factor). Если вы не хотите, чтобы SQL Server автоматически пересчитывал статистику по этому индексу через определенные периоды, установите также флажок Don’t automatically recompute statistics.
  • Вы можете использовать окно Properties для модифицирования ограничения UNIQUE ; например, вы можете изменять имя ограничения, указывать колонки, к которым присоединяется это ограничение, задавать ограничение как кластеризованный индекс и выбирать коэффициент заполнения для индекса. (О коэффициенте заполнения см. лекцию 17.) Внесите в это ограничение нужные вам изменения. По окончании щелкните на кнопке Close (Закрыть) и затем щелкните на кнопке Save в окне Design Table для сохранения ваших изменений.>
  • Ограничение PRIMARY KEY

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

  • В окне Design Table выберите колонку, щелкнув на одной из ячеек в ее строке. (Вы можете выбрать несколько колонок, удерживая клавишу Ctrl и щелкая на серых ячейках слева от имен колонок.)
  • Щелкните правой кнопкой мыши на одной из выбранных колонок и выберите из контекстного меню пункт Set Primary Key (Задать первичный ключ). Слева от колонок, которые вы задали для первичного ключа, появится изображение небольшого ключа. На рис. 16.13 показано окно Design Table для таблицы customer после указания колонки SSN как первичного ключа. Кроме того, из колонки SSN было удалено ограничение (рис 16.13) Задание ограничения PRIMARY KEY в окне Design Table
  • Если вам нужно переместить ограничение 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, выполните следующие шаги:

  • Щелкните правой кнопкой мыши на имени таблицы inventory в правой панели Enterprise Manager и выберите пункт Design Table. Щелкните правой кнопкой мыши на свободном месте этого окна и выберите из контекстного меню пункт Relationships (Связи). Появится окно Properties с открытой вкладкой Relationships (рис. 16.14).
  • Щелкните на кнопке New. Появится данные по умолчанию (рис. 16.15).
  • Мы выбираем для таблицы первичного ключа таблицу (рис 16.15) Вкладка Relationships (Связи) окна Properties (Свойства) для таблицы inventory(рис 16.14) Вкладка Relationships (Связи) с данными по умолчанию после щелчка на кнопке New (Создать)(рис 16.16) Вкладка Relationships, где показана связь по внешнему ключу между таблицами items и inventory
  • Внизу этого окна имеется несколько флажков (рис. 16.17). Установите флажок Check existing data on creation (Проверять существующие данные при создании), если вы хотите, чтобы SQL Server проверял существующие данные на связь по внешнему ключу. Если данные не согласуются, то ограничение не будет создано. Сбросьте этот флажок только в тех случаях, когда у вас еще нет данных или вы знаете, что существующие данные уже согласованы с этим ограничением, или вы не хотите по какой-либо причине, чтобы существующие данные были согласованы с ограничением. Но это может вызвать проблемы, если вы попытаетесь в дальнейшем обновить или удалить одну из существующих строк.
  • Следующий флажок – это Enable relationship for replication (Активизировать связь для репликации). Не устанавливайте его, если вы не используете репликацию. Но даже если вы используете репликацию, вам все же не нужно устанавливать этот флажок, поскольку данные будут проверяться на согласованность с данным ограничением уже в исходных таблицах, поэтому их не обязательно проверять при репликации. Если вы все же активизировали связь для репликации и если расписания репликации этих двух таблиц не синхронизированы в достаточной степени, то вы получите ошибки во время репликации, указывающие, что какая-либо строка не может быть реплицирована, поскольку в ней нарушено ограничение по внешнему ключу.
  • Следующий флажок – это Enable relationship for INSERT and UPDATE (Активизировать связь для операций INSERT и UPDATE). Установка этого флажка означает, что ограничение FOREIGN KEY будет проверяться при вставках и обновлениях, а также при удалениях. Если это является вашим намерением, установите данный флажок. Станут доступны два находящихся ниже флажка. Это флажки Cascade Update Related Fields (Каскадировать связанные с обновлением поля) и Cascade Delete Related Records (Каскадировать связанные с удалением записи). (Записью называется строка данных.)(рис 16.17) Вкладка Relationships, где показаны установленные флажки
  • Установка флажка 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". Работа оператора прекращена.)

  • Установка флажка 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". Работа оператора прекращена.)

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

    (рис 16.18) Схема базы данных для таблиц items и inventory

    Колонка item_id в таблице items – это колонка с первичным ключом (рис. 16.18). Это единственный "кандидат" для ссылки по внешнему ключу, так как для таблицы items не задано никаких ограничений UNIQUE. Чтобы создать связь по внешнему ключу между колонкой item_id таблицы inventory и колонкой item_id таблицы items, выполните следующие шаги.

  • Щелкните на крайней левой ячейке (серый квадрат) строки для колонки (рис 16.19) В Диалоговое окно Create Relationship (Создать связь), где показана предложенная связь по внешнему ключу
  • Если нужно, вы можете изменить имя этой связи. Установите или сбросьте флажки внизу этого диалогового окна, чтобы выбрать нужные вам опции. Эти флажки были описаны выше в этой лекции.
  • По окончании щелкните на кнопке OK, чтобы создать в схеме связь между таблицами (рис 16.20(рис 16.20) Схема базы данных, где показана связь по внешнему ключу
  • Щелкните на кнопке Save, чтобы сохранить ваши изменения. У вас будет запрошено имя схемы базы данных, и затем нужно будет подтвердить внесение изменений в соответствующие таблицы. Для завершения щелкните на кнопке Yes.
  • Чтобы модифицировать ограничение FOREIGN KEY, вы можете использовать аналогичным образом оба метода, описанных в данном разделе. В окне Design Table снова откройте вкладку Relationships, внесите изменения и сохраните свою работу. В схеме базы данных щелкните правой кнопкой мыши на линии связи по внешнему ключу и выберите пункт Properties для внесения изменений в соответствующее ограничение или выберите пункт Delete Relationship From Database (Удалить связь из базы данных), чтобы полностью удалить это ограничение. Если нужно, вы можете затем создать новое ограничение.

    Ограничение CHECK

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

  • Щелкните правой кнопкой мыши на окне Design Table и выберите из контекстного меню пункт Properties, чтобы появилось окно Properties. Щелкните на вкладке Check Constraints (Ограничения Check) (рис. 16.21) и щелкните на кнопке New для таблицы (рис 16.21) Вкладка Check Constraints (Ограничения Check) окна Properties
  • Далее введите выражение, которое хотите использовать для проверки данных, которые будут вводиться или обновляться. В нашем примере мы добавим ограничение CHECK по колонке price таблицы items, чтобы можно было помещать значения только от $1,00 до $1000,00 (рис. 16.22).
  • Обратите внимание на три флажка внизу этого окна. Установка флажка Check existing data on creation означает, что существующие данные таблицы будут проверяться на соответствие ограничению (рис 16.22) Добавление ограничения CHECK по колонке price таблицы items
  • Щелкните на кнопке Close и затем щелкните на кнопке Save, чтобы сохранить новое ограничение. Чтобы модифицировать ограничение CHECK, используйте вкладку Check Constraint для изменения имени (Constraint name), выражения (Constraint expression) и флажков. На рис. 16.23 ограничение CHECK по колонке price изменено, с диапазона от $1,00 до $1000,00 на диапазон от $1,00 до $99,00.
  • Отметим, флажок Check existing data on creation теперь сброшен, поскольку ограничение уже было создано. Если вы хотите проверить существующие данные на соответствие модифицированному диапазону, установите этот флажок. Если эта проверка не проходит для существующих данных, то вы получите сообщение об ошибке и ограничение не будет модифицировано.

    Вы можете также использовать вкладку Check Constraints для удаления ограничения CHECK, выбрав в списке Selected Constraint (Выбранное ограничение) имя ограничения, которое хотите удалить, и щелкнув на кнопке Delete.

    (рис 16.23) Модифицирование ограничения CHECK

    Объекты типа Rule

    Альтернативой использованию ограничения CHECK является создание объекта типа Rule (Rule-объекта) для ограничения значений, которые можно поместить или изменить в колонке. Rule-объект аналогичен Default-объекту в том, что он создается отдельно от таблицы и не удаляется при удалении таблицы. Вы должны также выполнить привязку Rule-объекта к колонке или к определенному пользователем типу – в данном случае – с помощью системной хранимой процедуры sp_bindrule. И, подобно Default-объекту, Rule-объекты включены в SQL Server 2000 для обратной совместимости с предыдущими версиями. Использование ограничения CHECK является предпочтительным методом ограничения значений колонок, но Rule-объекты полезно использовать, когда одно правило нужно использовать для нескольких колонок или определенных пользователем типов.

    Создание Rule-объекта с помощью T-SQL

    В качестве примера мы создадим Rule-объект, который выполняет ту же функцию, что и ограничение CHECK, которое мы создали выше. Наше правило использует имя переменной @price для ссылки на колонку price таблицы items. Имя переменной должно начинаться с символа "@", а имя можете выбрать произвольно. Сначала мы создадим данное правило и затем выполним его привязку к колонке, как это показано ниже:

    USE MyDB
    GO 
    CREATE RULE price_rule AS 
    (@price >= .01 AND @price <= 500.00) 
    GO 
    sp_bindrule 'price_rule', 'items.price', 'futureonly' 
    GO

    Для отмены привязки правила и его удаления используйте следующий оператор:

    sp_unbindrule 'items.price'
    GO 
    DROP RULE price_rule 
    GO

    Для процедур sp_bindrule и sp_unbindrule указываются те же параметры, что и для процедур sp_bindefault и sp_unbindefault (см. раздел "Оператор CREATE DEFAULT и процедура sp_bindefault" выше в этой лекции). Каждая колонка или определенный пользователем тип может иметь только одно правило, хотя вы можете одновременно присвоить одной колонке или определенному пользователем типу правило и одно или несколько ограничений CHECK. Если вы сделаете это, SQL Server будет применять правило и все ограничения к данным таблицы при их вставке или обновлении.

    Создание Rule-объекта с помощью Enterprise Manager

    Чтобы использовать Enterprise Manager для создания и привязки Rule-объекта, выполните следующие шаги.

  • Раскройте имя сервера и имя базы данных в Enterprise Manager. Щелкните правой кнопкой мыши на Rules (Правила) и затем выберите из контекстного меню пункт New Rule (Создать правило), чтобы появилось окно Rule Properties (Свойства правила). В данном примере мы зададим имя правила price_rule и добавим текст (рис 16.24(рис 16.24) Окно Rule Properties (Свойства правила) для создания правила
  • Для привязки правила щелкните на Rules в левой панели Enterprise Manager, щелкните правой кнопкой мыши на новом правиле и затем выберите из контекстного меню пункт Properties, чтобы появилось окно Rule Properties. Как и в случае привязки Default-объектов, щелкните на кнопке Bind UDTs для привязки данного правила к определенному пользователем типу или щелкните на Bind Columns для привязки данного правила к колонке или к колонкам. В данном примере мы щелкнем на кнопке Bind Columns и выберем колонку price таблицы (рис 16.25) Привязка правила к колонке
  • Щелкните на кнопке OK, чтобы применить ваше правило, и затем снова щелкните на кнопке OK, чтобы закрыть окно Rule Properties
  • Чтобы удалить правило, вы должны сначала отменить привязку правила ко всем колонкам или определенным пользователем типам. После отмены привязки правила щелкните правой кнопкой мыши на имени этого правила, выберите из контекстного меню пункт Delete и затем щелкните на кнопке Drop All в диалоговом окне Drop Objects. Если имеется привязка правила к какой-либо колонке, когда вы пытаетесь удалить его, то SQL Server выведет сообщение об ошибке и не удалит данное правило.

    Заключение

    В этой лекции вы узнали об умолчаниях и пяти типах ограничений, которые можно задать по колонке или таблице; вы также узнали, как создавать и модифицировать умолчания и ограничения с помощью T-SQL и Enterprise Manager. Кроме того, узнали, как создавать и модифицировать умолчания и правила с помощью Default-объектов и Rule-объектов. Умолчания позволяют задавать для колонки значение по умолчанию, когда не задано конкретное значение. Ограничения можно использовать различными способами для обеспечения целостности данных в вашей базе данных. Умолчания и ограничения является полезными средствами, если они продуманно применяются к вашим таблицам базы данных. В лекции 17 мы рассмотрим использование индексов в SQL Server, включая кластеризованные и некластеризованные индексы. Использование индексов может в огромной степени увеличить эффективность доступа к данным.

    Страницы:

    Умолчания, ограничения и правила – это необязательные атрибуты, которые можно определять по колонкам и таблицам базы данных. В лекции 15 вы ознакомились с умолчаниями, когда описывалось добавление к таблице колонки со значением по умолчанию с помощью оператора ALTER TABLE. В этой лекции вы узнаете о двух методах создания и модифицирования умолчаний. Напоминаем, что умолчания (значения по умолчанию *) – это значения, которые заносятся в определенную колонку, когда не указано явно никакого значения. Ограничения (constraints)** используются как способ идентифицирования допустимых значений для колонки (чтобы отклонять недопустимые значения) а также как средство обеспечения целостности данных в таблицах базы данных и между связанными таблицами. Мы рассмотрим в этой лекции пять типов ограничений; вы также узнаете, как создавать и модифицировать умолчания и ограничения с помощью Transact-SQL (T-SQL) и Microsoft SQL Server Enterprise Manager, хотя использование Enterprise Manager часто оказывается проще.

    Умолчания

    Сначала рассмотрим причину, по которой вам может потребоваться использование умолчаний для определенных колонок таблицы; для этого мы посмотрим, что происходит, если вы не задали значение по умолчанию. Если в таблицу вводится строка, содержащая колонки без значений по умолчанию, и не во все колонки, допускающие null -значения, введены конкретные данные, то этим колонкам присваивается значение NULL. Но если колонка определена с атрибутом NOT NULL и вы не ввели какое-либо значение в эту колонку при вводе строки, то будет возвращено сообщение об ошибке, информирующее, что в эту колонку нельзя поместить значение NULL. Именно в этом случае удобно применять умолчания. Умолчания можно использовать, чтобы указывать определенное значение, которое будет помещено вместо значения NULL, и тогда вы не получите сообщения об ошибке. Вам следует использовать умолчания для колонок таблицы вместо разрешения использовать null -значения, поскольку операции по таким колонкам создают более высокую дополнительную нагрузку на систему, чем операции по колонкам, в которых не допускаются null -значения.

    Microsoft SQL Server 2000 позволяет вам определять значение по умолчанию для каждой колонки таблицы. Вы не можете задать умолчание для колонок, имеющих тип данных timestamp или обладающих свойством IDENTITY или ROWGUIDCOL, поскольку эти колонки должны иметь уникальные значения. Колонки этого типа несовместимы со значениями по умолчанию, поскольку применение такого значения к колонке более одного раза приводило бы к тому, что колонка уже не имела бы уникальных значений. Вы можете присваивать только одно значение по умолчанию, и оно будет автоматически использоваться каждый раз, когда это требуется. И еще одно важное замечание относительно умолчаний: значение, задаваемое по умолчанию, должно быть совместимо с типом данных соответствующей колонки.

    Значение по умолчанию можно создавать и модифицировать несколькими способами. В этом разделе мы рассмотрим, как определять значение по умолчанию при создании таблицы и как модифицировать колонку, чтобы добавлять или изменять умолчание, сначала – с помощью T-SQL и затем – с помощью Enterprise Manager. Напомним, что в лекции 15 мы рассматривали добавление колонок со значением по умолчанию и влияние этого значения на существующие строки. Вы увидите здесь менее подробный пример такой вставки. Мы также рассмотрим возможности и влияние вставки значения по умолчанию в существующую колонку таблицы.

    Определение и модифицирование умолчаний с помощью T-SQL

    Вы можете определять значение по умолчанию для колонки посредством одного из трех операторов T-SQL: CREATE TABLE, ALTER TABLE или CREATE DEFAULT. Оператор CREATE DEFAULT, который используется в SQL Server 2000 для совместимости с предыдущими версиями, создает объект типа Default (Default-объект). Если вы используете данный метод, SQL Server сохраняет этот объект отдельно от таблицы, поэтому вы должны выполнять привязку этого объекта к колонке или колонкам с помощью системной хранимой процедуры sp_bindefault. Если вы удаляете таблицу, определение DEFAULT автоматически теряет связь с этой таблицей, но сам Default -объект остается. Но если вы используете метод CREATE TABLE или ALTER TABLE, то SQL Server сохраняет определение DEFAULT вместе с таблицей и при удалении таблицы происходит автоматическое удаление этого умолчания без необходимости выполнения дополнительных шагов. По этой причине обычно рекомендуют не использовать оператор CREATE DEFAULT. Однако использование Default -объекта может оказаться полезным, если одно значение по умолчанию будет использоваться для нескольких колонок.

    Для запуска ваших операторов T-SQL вам следует использовать анализатор запросов SQL Query Analyzer, поскольку результаты будут появляться в виде графического пользовательского интерфейса (GUI), что проще для чтения, чем при запуске операторов в окне командной строки.

    Оператор CREATE TABLE с атрибутом DEFAULT

    Создание умолчания для колонки с помощью оператора CREATE TABLE является предпочтительным, стандартным методом. Следующий оператор создает в базе данных MyDB таблицу, содержащую умолчания для обеих колонок, – columnA (типа char) и columnB (типа int):

    USE MyDB
    CREATE TABLE MyTable 
    ( 
    columnA  		char(15) 		NULL DEFAULT 'n/a', 
    columnB  		int      		NULL DEFAULT 0 
    ) 
    GO

    Значение по умолчанию n/a (сокращение от not applicable – неприменимо) для колонки columnA совместимо с типом данных char этой колонки, и значение по умолчанию 0 для колонки columnB совместимо с типом данных int . Если при вставке новой строки в таблицу не указывается конкретное значение для одной или обеих колонок, то используется соответствующее значение по умолчанию. Поэтому единственным способом присваивания этим колонкам значения NULL является явная вставка NULL. Null -значения допустимы, поскольку для обеих колонок указан атрибут NULL. Если бы колонки были определены как NOT NULL, то вы не могли бы выполнять явную вставку значения NULL.

    Оператор ALTER TABLE с атрибутом DEFAULT

    Чтобы изменить определение DEFAULT для колонки или добавить это определение к колонке, вы можете использовать оператор ALTER TABLE. Если значение по умолчанию уже определено и вам нужно изменить его с помощью этой команды, то вы должны сначала удалить существующее умолчание, указав его имя, и затем добавить новое умолчание. (При использовании Enterprise Manager вам не придется выполнять этот шаг, и это поможет вам понять, что использование Enterprise Manager является более простым методом. Изменив таблицу с помощью Enterprise Manager, вы можете также в любой момент генерировать сценарии для повторного создания таблицы.)

    Предположим, что вы не хотите изменять существующее умолчание. Если вы создали умолчание с помощью оператора CREATE TABLE или с помощью Enterprise Manager (что будет описано ниже в этой лекции), но не присвоили имя самому умолчанию, то SQL Server присвоит имя автоматически. Чтобы выяснить, какое имя было присвоено умолчанию (имя используется для удаления умолчания с помощью T-SQL), вы можете запустить хранимую процедуру sp_help, указав имя таблицы, для которой задано это умолчание, как в следующем примере:

    USE MyDB
    GO
    sp_help MyTable
    GO

    Имена всех ограничений default по таблице MyTable появятся в конце выводимых результатов в столбце под заголовком constraint_name (имя_ограничения) (рис. 16.1).

    Предположим, что вы хотите изменить для колонки columnA значение по умолчанию n/a на значение not applicable. Напомним, что мы должны сначала удалить существующее умолчание и затем добавить новое. Чтобы удалить умолчание, используйте следующий оператор:

    ALTER TABLE MyTable
    DROP CONSTRAINT DF__MyTable__columnA__1920BF5CGO

    С помощью следующего оператора мы можем теперь добавить новое умолчание, присвоив ему на этот раз имя:

    ALTER TABLE MyTable
    ADD CONSTRAINT DF_MyTable_columnA  
    DEFAULT 'not applicable' FOR columnA 
    GO

    Если вы изменяете существующее умолчание по какой-либо колонке, для всех существующих строк в этой колонке остаются прежние значения, даже если это значение NULL. Новое значение по умолчанию будет использоваться только для новых строк.

    (рис 16.1) Результаты работы хранимой процедуры sp_help
    ALTER TABLE MyTable
    ADD columnC tinyint 	NOT NULL DEFAULT 13 
    GO

    Теперь таблица MyTable содержит еще одну колонку, columnC, которая имеет значение по умолчанию 13. Поскольку columnC – новая колонка, определенная с атрибутом NOT NULL, этой колонке в уже существующих строках таблицы будет присвоено значение по умолчанию 13.

    Если бы в новой колонке было разрешено использование значений NULL, то все существующие строки получили бы в новой колонке значение NULL. Если нужно, чтобы этой колонке было присвоено значение по умолчанию (вместо NULL), то в предложении DEFAULT нужно использовать параметр WITH VALUES, как это показано ниже:

    ALTER TABLE MyTable
    ADD columnC tinyint 	NULL DEFAULT 13 WITH VALUES 
    GO

    При использовании WITH VALUES новой колонке во всех существующих строках таблицы MyTable будет присвоено значение 13 (вместо значения NULL ).

    Теперь, когда вы знаете, как создавать определение DEFAULT, которое сохраняется вместе с таблицей, рассмотрим использование оператора CREATE DEFAULT. С помощью этого метода создается Default -объект, который хранится отдельно от таблицы.

    Оператор CREATE DEFAULT и процедура sp_bindefault

    Вы можете также добавить умолчание к существующей колонке или изменить умолчание по колонке, создав сначала Default-объект с помощью оператора T-SQL CREATE DEFAULT. Создав Default-объект, вы можете затем связать его с колонкой или с определенным пользователем типом данных, используя системную хранимую процедуру sp_bindefault. Как уже говорилось, этот метод остался в SQL Server 2000 только для обратной совместимости; он не является предпочтительным методом, но может оказаться полезным, если вы будете использовать одно значение по умолчанию для колонок нескольких таблиц.

    Рассмотрим пример использования оператора CREATE DEFAULT для создания Default-объекта с именем DF_not_applicable и значением n/a. Это умолчание будет создано в базе данных MyDB и затем будет связано с колонкой columnA таблицы MyTable (в предположении, что для этой таблицы не существует никаких умолчаний). Оператор CREATE DEFAULT имеет следующий синтаксис:

    CREATE DEFAULT имя_умолчания AS выражение-константа
    Процедура sp_bindefault имеет следующий синтаксис:
    sp_bindefault 'имя_умолчания', таблица.колонка | определенный_пользователем_тип_данных
    [, futureonly]

    Параметр имя_умолчания – это имя Default-объекта. Параметр таблица.колонка указывает колонку, которой вы хотите присваивать это умолчание.

    С помощью следующих операторов T-SQL создается Default-объект и происходит его привязка к колонке columnA таблицы MyTable:

    USE MyDB
    GO 
    CREATE DEFAULT DF_not_applicable AS 'n/a' 
    GO 
    sp_bindefault 'DF_not_applicable', 'MyTable.columnA' 
    GO

    Если для колонки columnA уже задано значение по умолчанию, то SQL Server возвратит сообщение об ошибке, информирующее вас, что вы не можете выполнить привязку умолчания к колонке, для которой уже задано какое-либо умолчание. Удалите сначала это умолчание и затем выполните привязку нового умолчания к данной колонке. (Процесс использования оператора DROP DEFAULT для удаления Default-объекта описывается ниже в этом разделе.)

    Вы можете также создать Default-объект и выполнить его привязку непосредственно к определенному пользователем типу данных. Любая колонка, которой присваивается этот конкретный тип данных, наследует данное умолчание автоматически. Вы можете использовать при обращении к процедуре sp_bindefault необязательный параметр futureonly, когда выполняете привязку Default-объекта к определенному пользователем типу данных. Этот параметр препятствует тому, чтобы существующие колонки, имеющие этот определенный пользователем тип данных, наследовали новое умолчание; тем самым только новые колонки с этим типом данных будут наследовать это умолчание. Если параметр futureonly не указан, то SQL Server выполнит привязку ко всем существующим и вновь создаваемым колонкам, имеющим определенный пользователем тип данных.

    Например, создадим определенный пользователем тип данных с именем area_code (код_района) и Default-объект с именем DF_area_code и значением 786; тем самым будет выполнена привязка этого умолчания к определенному пользователем типу данных. (О создании определенных пользователем типов данных см. лекцию 10.) Это новый определенный пользователем тип данных, т.е. еще нет колонок с этим типом данных, поэтому параметр futureonly не требуется. Тем не менее мы включим его, чтобы показать его синтаксис, хотя это не окажет никакого влияния. Ниже показаны соответствующие операторы:

    sp_addtype 'area_code', 'char(3)', 'NOT NULL'
    GO 
    
    CREATE DEFAULT DF_area_code AS 786 
    GO 
    
    sp_bindefault 'DF_area_code', 'area_code', 'futureonly' 
    GO

    Чтобы увидеть на экране этот тип данных и присвоенное ему значение по умолчанию, используйте системную хранимую процедуру sp_help (рис. 16.2).

    (рис 16.2) Результаты Query Analyzer для процедуры sp_help

    Процедура sp_unbindefault

    Чтобы аннулировать привязку Default-объекта к колонке или определенному пользователем типу данных, используйте процедуру sp_unbindefault, указав имя таблицы и имя колонки или имя определенного пользователем типа данных. Например, для аннулирования привязки Default-объекта DF_not_applicable к колонке columnA таблицы MyTable используйте следующий оператор:

    sp_unbindefault 'MyTable.columnA'
    GO

    Для аннулирования привязки умолчания к определенному пользователем типу данных area_code используйте следующий оператор:

    sp_unbindefault 'area_code'
    GO

    После этого все колонки, которым был присвоен определенный пользователем тип данных area_code, уже не обладают свойством использования умолчания.

    Вы можете выполнить привязку Default-объекта к более чем одной колонке с помощью отдельных операторов sp_bindefault. Кроме того, отменив привязку умолчания к колонке, вы можете снова выполнить его привязку, пока не удалили сам Default-объект. Чтобы удалить Default-объект, используйте оператор DROP DEFAULT, как это показано ниже:

    DROP DEFAULT DF_area_code
    GO

    После удаления Default-объекта он уже недоступен. Если вам нужно использовать его снова, вы должны применить оператор CREATE DEFAULT для повторного создания этого объекта.

    Определение и модифицирование умолчаний с помощью Enterprise Manager

    Как вы уже видели в лекции 15, использование Enterprise Manager – это, видимо, наиболее простой способ создания, просмотра и модифицирования таблиц вашей базы данных. При создании или модифицировании таблицы или колонки с помощью Enterprise Manager система SQL Server автоматически берет на себя исполнение соответствующих команд T-SQL, выполняя эту работу за вас. (Пошаговые инструкции по созданию таблицы с помощью Enterprise Manager см. в лекции 10.) В этом разделе мы рассмотрим особенности использования Enterprise Manager для присваивания и модифицирования умолчания по колонке и создания Default-объекта. Это предпочтительный метод работы. Начнем с примеров присваивания и модифицирования умолчаний.

    Присваивание и модифицирование умолчаний

    Предположим, у нас имеется таблица с именем Product_Info в базе данных MyDB (рис. 16.3). (Инструкции по созданию этой таблицы с помощью Enterprise Manager см. в лекции 10.)

    Чтобы определить умолчание, просто щелкните на имени колонки, которой хотите присвоить это умолчание, и введите значение по умолчанию в поле Default Value (Значение по умолчанию) вкладки Columns (Колонки) внизу окна. На рис. 16.3 колонке Description (Описание) присвоено значение по умолчанию "n/a"; это может быть значение-заполнитель, указывающее, что описание продукта еще не известно. Кроме того, значение по умолчанию заключено в круглые скобки – Enterprise Manager добавляет их автоматически, когда вы сохраняете таблицу.

    Изменение значения по умолчанию происходит столь же просто. Замените исходное значение по умолчанию новым значением по умолчанию и сохраните свою работу, щелкнув на кнопке Save (Сохранить). На рис. 16.4 показано, что значение по умолчанию колонки Description изменено на "not available"; на рис. 16.5 показано умолчание "general merchandise" (обычные товары), добавленное к колонке Product_Name (Имя_продукта).

    (рис 16.3) Окно Design Table (Разработка таблицы) для таблицы Product_InfoПримечание. Вводя символьную строку для значения по умолчанию, вы должны заключить ее в апострофы, иначе SQL Server выдаст сообщение об ошибке, когда вы попытаетесь сохранить соответствующее изменение.

    Когда вы создаете или изменяете умолчание для существующей колонки с помощью Enterprise Manager, то, как и при использовании T-SQL, это не влияет на существующие строки таблицы: новое значение по умолчанию используется только при вставке новых строк. Если вы добавляете к таблице новую колонку и присваиваете ей значение по умолчанию, то в существующих строках данных этой колонке присваивается значение по умолчанию только в том случае, если не разрешено использование значений NULL. В противном случае эта новая колонка получит в существующих строках значение NULL. Чтобы разрешить использование значений NULL для новой колонки со вставкой значения по умолчанию в эту колонку для всех существующих строк, используйте метод, описанный в разделе "Оператор ALTER TABLE с атрибутом DEFAULT" выше в этой лекции.

    (рис 16.5) Окно Design Table, где показано измененное значение по умолчанию(рис 16.4) Окно Design Table, где показано добавленное значение по умолчанию

    Создание Default-объектов и управление этими объектами

    Вы можете также создавать Default-объект и просматривать существующие Default-объекты с помощью Enterprise Manager. Для просмотра существующих Default-объектов откройте Enterprise Manager, раскройте сервер и базу данных, которые хотите использовать, и щелкните на папке Defaults. Все существующие Default-объекты появятся в правой панели (рис. 16.6). Отметим, что показаны умолчания DF_not_applicable и DF_area_code, которые мы создали выше в этой лекции с помощью оператора CREATE DEFAULT.

    (рис 16.6) Просмотр существующих Default-объектов

    Чтобы создать новый Default-объект и выполнить привязку этого умолчания к колонке или определенному пользователем типу данных с помощью Enterprise Manager, выполните следующие шаги.

  • Раскройте сервер и базу данных, щелкните правой кнопкой мыши на Defaults и выберите из контекстного меню пункт New Default (Создать умолчание), чтобы появилось окно Default Properties (Свойства умолчания) (рис. 16.7). Мы присвоим Default-объекту имя DF_none и значение "none". По окончании щелкните на кнопке OK.
  • Для привязки вашего умолчания к определенному пользователем типу данных или к колонке щелкните правой кнопкой мыши в правой панели Enterprise Manager на имени этого умолчания (в данном случае – Щелкните на кнопке Bind UDTs, чтобы появилось диалоговое окно Bind Default to User-defined Data Types (Привязка умолчания к определенным пользователем типам данных) (рис 16.8(рис 16.8) Окно Default Properties (Свойства умолчания)(рис 16.7) Диалоговое окно Bind Default to User-defined Data Types (Привязка умолчания к определенным пользователем типам данных)
  • Для привязки умолчания к колонке щелкните на пункте Bind Columns (Привязка к колонкам), чтобы появилось диалоговое окно Bind Default to Columns (Привязка умолчания к колонкам). Теперь выберите колонку, с которой хотите связать данное умолчание. Сначала выберите имя таблицы в раскрывающемся списке Table (Таблица). Затем в списке Unbound Columns (Колонки без привязки) выберите имя колонки, с которой хотите связать умолчание. Затем щелкните на кнопке Add (Добавить). На рис 16.9(рис 16.9) Диалоговое окно Bind Default to Columns (Привязка умолчания к колонкам))
  • Щелкните на кнопке OK, чтобы вернуться в окно Default Properties, и щелкните на кнопке OK еще раз, чтобы закрыть окно Default Properties.
  • Чтобы отменить привязку Default-объект а к определенному пользователем типу в окне Default Properties, откройте диалоговое окно Bind Default to User-defined Data Types, как это описано выше, и просто сбросьте флажок Bind. Чтобы отменить привязку Default-объект а к колонке, откройте диалоговое окно Bind Default to Columns, выделите имя этой колонки и затем щелкните на кнопке Remove (Удалить).

    Чтобы удалить Default-объект, вы должны сначала отменить привязку этого умолчания ко всем другим объектам (как только что было описано). SQL Server возвратит сообщение об ошибке, если вы попытаетесь удалить умолчание, которое привязано к одному или нескольким объектам. Для удаления Default-объект а щелкните на папке Defaults в левой панели Enterprise Manager, щелкните правой кнопкой мыши на имени этого Default-объект а, выберите из контекстного меню пункт Delete и затем щелкните на кнопке Drop All (Удалить все) в появившемся диалоговом окне Drop Objects (Удаление объектов).

    Ограничения

    Ограничения автоматически обеспечивают целостность данных. Ограничения задают правила, которые определяют значения данных, допустимые для какой-либо колонки. Они позволяют ограничивать значения данных, которые вводятся в колонку, чтобы в этой колонке не оказались неверные значения. Например, с помощью ограничения вы можете ограничить значения колонки целого типа диапазоном от 1 до 100. В результате любые значения вне этого диапазона нельзя будет ввести в данную колонку. (Для создания этого диапазона вы можете использовать ограничение CHECK, как будет показано ниже.) Ограничение только по одной колонке называется ограничением колонки ; оно ограничивает значения только этой колонки. Ограничение, которое влияет на несколько колонок, называется ограничением таблицы, или табличным ограничением; в этом случае комбинация значений для колонок, указанных в данном ограничении, должна отвечать требованиям этого ограничения. Имеется пять типов ограничений: NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY и CHECK.

    Создание и модифицирование ограничений с помощью T-SQL

    В этом разделе вы узнаете об использовании каждого типа ограничений и реализации ограничений с помощью T-SQL. В следующем разделе вы узнаете, как реализовывать ограничения с помощью Enterprise Manager.

    Ограничение NOT NULL

    Ограничение NOT NULL является довольно простым, и мы уже видели, как оно использовалось в примерах этой лекции и предыдущих лекций. Ограничение NOT NULL задается в описании колонки, чтобы воспрепятствовать вставке null -значений в эту колонку (в противоположность ограничению NULL, которое разрешает присваивать null -значения). При использовании T-SQL вы можете указать NOT NULL при создании таблицы или позже, когда будете модифицировать какую-либо колонку. (О модифицировании таблиц базы данных см. лекцию 10.) Вам следует использовать NOT NULL вместо NULL там, где это возможно, поскольку операции с null -значениями, такие как сравнения, сопряжены с большей дополнительной нагрузкой при обработке. Как уже говорилось выше в этой лекции, лучше использовать значение по умолчанию там, где это возможно, чем разрешать вставку null -значений.

    Ограничение UNIQUE

    Ограничение UNIQUE обеспечивает, что в колонке или наборе колонок не будут допускаться дублированные значения; иными словами, обеспечивается уникальность значений в этой колонке или наборе колонок. Для поддержки этой уникальности SQL Server создает по умолчанию уникальный некластеризованный индекс по колонке или колонкам, указанным в ограничении UNIQUE. Вы можете, однако, указывать, каким должен быть этот индекс – кластеризованным или некластеризованным. Напомним, что таблица может иметь только один кластеризованный индекс.

    Примечание. Вы будете часто встречать в этой лекции термины "кластеризованный индекс" и "некластеризованный индекс". Не беспокойтесь, если вы не совсем понимаете, что означают эти термины, – в лекции 17 дается подробное описание этих типов индексов.

    Ограничение UNIQUE можно использовать для любой колонки, которая не является частью ограничения PRIMARY KEY (описывается в следующем разделе), которое также обеспечивает уникальность значений. Ограничение UNIQUE можно использовать для колонок, в которых разрешены null -значения, в то время как ограничения PRIMARY KEY нельзя использовать для таких колонок. Null -значения не затрагиваются ограничениями UNIQUE. На колонку с ограничением UNIQUE может ссылаться ограничение FOREIGN KEY (см. раздел "Ограничение FOREIGN KEY" далее). По одной таблице можно задавать несколько ограничений UNIQUE, пока общее число индексов для этой таблицы не превышает 249 некластеризованных и одного кластеризованного индекса.

    Чтобы создать ограничение UNIQUE по таблице с помощью T-SQL, используйте оператор CREATE TABLE или ALTER TABLE. Например, следующий оператор создает таблицу customer (покупатель) с ограничением UNIQUE по колонке SSN в виде кластеризованного индекса:

    CREATE TABLE customer
    (
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11) 	NOT NULL UNIQUE CLUSTERED, 
    cust_phone   		char(10) 	NULL 
    ) 
    GO

    В этом операторе CREATE использовано ограничение по колонке. В следующем примере снова создается таблица, но на этот раз с добавлением табличного ограничения UNIQUE с именем UQ_full_name по колонкам first_name, mid_init и last_name:

    CREATE TABLE customer
    ( 
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11) 	NOT NULL UNIQUE CLUSTERED, 
    cust_phone   		char(10) 	NULL, 
    CONSTRAINT   	UQ_full_name UNIQUE NONCLUSTERED (first_name,  
        				mid_init, last_name) 
    ) 
    GO

    Табличное ограничение UNIQUE (ограничение по более чем одной колонке) обеспечивает уникальность комбинаций значений по соответствующим колонкам. В данном случае в базу данных нельзя ввести двух покупателей, имеющих одинаковое сочетание имени (first_name), фамилии (last_name) и инициала отчества (mid_init). В одной или двух колонках может встретиться одинаковая комбинация, но не во всех трех колонках. Отметим, что в данном случае табличное ограничение UNIQUE является некластеризованным индексом, поскольку у нас уже имеется уникальный кластеризованный индекс по колонке SSN.

    Чтобы добавить ограничение UNIQUE к существующей таблице, используйте оператор ALTER TABLE. Если вы пытаетесь модифицировать существующую колонку или колонки, добавляя ограничение UNIQUE, все существующие строки данной таблицы должны содержать уникальные значения или null -значения в этой колонке или колонках, иначе вы получите сообщение об ошибке и ограничение UNIQUE не будет добавлено. Предположим, что мы создали таблицу customer без каких-либо ограничений. Ниже приводятся два оператора для добавления ограничений по колонке и по таблице:

    ALTER TABLE customer 
    ADD CONSTRAINT UQ_ssn UNIQUE CLUSTERED (SSN) 
    GO
    
    ALTER TABLE customer 
    ADD CONSTRAINT UQ_full_name UNIQUE NONCLUSTERED (first_name, mid_init, last_name) 
    GO

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

    Чтобы изменить существующее ограничение UNIQUE по какой-либо колонке или таблице с помощью T-SQL, вы должны сначала удалить соответствующее ограничение и затем снова создать его. Как и для умолчаний, вам следует использовать для ваших ограничений описательные имена, чтобы вы могли легко находить и удалять их без необходимости выяснения имен, присвоенных им системой SQL Server. При изменении ограничения с помощью Enterprise Manager система SQL Server автоматически удаляет старое ограничение и вновь создает его, когда вы сохраняете выполненные изменения (см. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее).

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

    Ограничение PRIMARY KEY используется, чтобы задать первичный ключ таблицы, представляемый колонкой или набором колонок, уникальным образом идентифицирующих строку таблицы. Поскольку первичный ключ идентифицирует строку, соответствующая колонка никогда не содержит значения NULL. В этом состоит отличие ограничения PRIMARY KEY от ограничения UNIQUE, которое допускает null-значения. Если вы определяете ограничение PRIMARY KEY по набору колонок, это ограничение указывает, что комбинация значений этих колонок должна быть уникальной для каждой строки, что аналогично ограничению UNIQUE по набору колонок. И, подобно ограничению UNIQUE, ограничение PRIMARY KEY не допускает дублированных значений. Если ограничение PRIMARY KEY присваивается колонке или набору колонок, то по этой колонке или колонкам первичного ключа автоматически создается уникальный индекс. Вы можете также задать для первичного ключа кластеризованный или некластеризованный индекс; если ничего не задано, по умолчанию создается кластеризованный индекс, если таблица еще не имеет кластеризованного индекса.

    Таблица может иметь только одно ограничение PRIMARY KEY. Колонка с атрибутом IDENTITY хорошо подходит для первичного ключа, как и любая другая колонка или набор колонок, являющиеся уникальными для каждой строки. Например, в примере нашей таблицы customer мы могли бы создать колонку SSN как первичный ключ вместо создания для нее ограничения UNIQUE. Ограничение PRIMARY KEY не допускало бы null -значений и обеспечивало бы уникальность значений в колонке SSN, а по этой колонке первичного ключа был бы автоматически создан кластеризованный индекс. Следующий оператор T-SQL представляет один из способов задания колонки SSN как первичного ключа, когда вы определяете таблицу. При этом способе имя ограничению PRIMARY KEY присваивает SQL Server, поэтому он не является предпочтительным методом, так как в дальнейшем вам может потребоваться удаление данного ключа по имени.

    CREATE TABLE 	customer
    ( 
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11) 	PRIMARY KEY, 
    cust_phone   		char(10) 	NULL 
    ) 
    GO

    Используя альтернативный способ, вы можете присвоить имя этому ограничению, добавив ключевое слово CONSTRAINT. Чтобы присвоить имя PK_SSN вашему ограничению PRIMARY KEY, используйте следующий оператор:

    CREATE TABLE 	customer
    ( 
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11) 	CONSTRAINT PK_SSN PRIMARY KEY, 
    cust_phone   		char(10) 	NULL 
    ) 
    GO

    Вы можете также задать ограничение PRIMARY KEY после того, как определены все колонки таблицы. При использовании этого синтаксиса имя колонки должно быть заключено в круглые скобки и указано после предложения CONSTRAINT, как это показано в следующем операторе:

    CREATE TABLE 	customer
    ( 
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11), 
    cust_phone   		char(10) 	NULL, 
    CONSTRAINT PK_SSN PRIMARY KEY (SSN) 
    ) 
    GO

    Чтобы добавить ограничение PRIMARY KEY к таблице, не имеющей ограничения PRIMARY KEY, используйте оператор ALTER TABLE. Следующий оператор добавляет ограничение PRIMARY KEY к таблице customer:

    ALTER TABLE 	customer
    ADD CONSTRAINT PK_SSN PRIMARY KEY CLUSTERED (SSN) 
    GO

    Здесь мы включили необязательное ключевое слово CLUSTERED, чтобы просто разъяснить, что по колонке первичного ключа будет создан кластеризованный индекс, хотя это происходит по умолчанию.

    Чтобы удалить ограничение PRIMARY KEY, используйте оператор ALTER TABLE с предложением DROP CONSTRAINT. Ниже мы удаляем ограничение по колонке SSN:

    ALTER TABLE customer
    DROP CONSTRAINT PK_SSN
    GO

    Отметим, что для предложения DROP CONSTRAINT требуется только имя данного ограничения. Чтобы изменить существующее ограничение PRIMARY KEY по таблице с помощью операторов T-SQL, вы должны сначала удалить существующее ограничение и затем выполнить изменение таблицы, добавив новое ограничение. Это выполняется с помощью операторов ALTER TABLE...DROP CONSTRAINT и ALTER TABLE...ADD CONSTRAINT.

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

    Ограничение FOREIGN KEY определяет внешний ключ который задает связь между двумя таблицами. Колонка или колонки внешнего ключа одной таблицы ссылаются на потенциальный ключ (одна или несколько колонок) в другой таблице. При вставке строки в таблицу с ограничением FOREIGN KEY значения, которые должны быть внесены в колонку или колонки, определенные как внешний ключ, сравниваются со значениями в потенциальном ключе ссылочной таблицы. Если ни одна из строк ссылочной таблицы не соответствует значениям во внешнем ключе, то вставка новой строки не выполняется. Но если значения внешнего ключа, которые нужно внести в таблицу, все же имеются в потенциальном ключе другой таблицы, то вставка новой строки будет выполнена. Если значение, которое должно быть занесено в таблицу с ограничением FOREIGN KEY, равно NULL, то это тоже допустимо.

    Проверка ограничений FOREIGN KEY происходит также в тех случаях, когда вы хотите обновить какую-либо строку в ссылочной таблице или в таблице с внешним ключом. Вы не сможете обновить какое-либо значение потенциального ключа или внешнего ключа, если это приведет к нарушению ограничения. Существует одно исключение из этого правила, когда вы обновляете ссылочную таблицу с помощью опции ON UPDATE CASCADE оператора T-SQL CREATE TABLE. (См. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее.) Кроме того, ограничения FOREIGN KEY проверяются, если вы хотите удалить какую-либо строку из ссылочной таблицы. Вы не сможете удалить строку из ссылочной таблицы, если строка какой-либо таблицы с внешним ключом (таблицы, содержащей ограничение FOREIGN KEY ) содержит ссылку на значение в колонке внешнего ключа.

    Иными словами, для каждой строки в таблице с внешним ключом должна существовать соответствующая строка в ссылочной таблице, и эту строку нельзя удалить, пока на нее имеется ссылка. Существует также исключение из этого правила: вы можете удалить строку из ссылочной таблицы с помощью опции ON DELETE CASCADE оператора T-SQL CREATE TABLE.(См. раздел "Создание и модифицирование ограничений с помощью Enterprise Manager" далее.)

    Внешний ключ может ссылаться только на те колонки, которые содержат в ссылочной таблице ограничение PRIMARY KEY или UNIQUE. Если вы попытаетесь создать внешний ключ, который ссылается на колонку, не являющуюся частью одного из этих ограничений, то SQL Server возвратит сообщение об ошибке. Кроме того, тип данных и размер колонки или колонок внешнего ключа должны совпадать со ссылочной колонкой или колонками.

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

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

    Затем мы создадим таблицу с именем inventory, содержащую ограничение FOREIGN KEY с именем FK_item_id, которое ссылается на колонку item_id в таблице items, как в следующем операторе:

    CREATE TABLE 	inventory
    ( 
    store_id        	tinyint    	NOT NULL, 
    item_id         	smallint   	NOT NULL,  
    item_quantity   	tinyint    	NOT NULL, 
    CONSTRAINT      	FK_item_id 	FOREIGN KEY (item_id)  
    REFERENCES      	items(item_id) 
    ) 
    GO

    Чтобы увидеть, каким образом связаны эти таблицы, мы создадим схему (диаграмму) базы данных (рис. 16.10). (Инструкции по созданию схемы базы данных см. в лекции 15.) В данном примере items – это ссылочная таблица с потенциальным ключом item_id. Это единственно возможный потенциальный ключ, поскольку он является первичным ключом в данной таблице и эта таблица не содержит никаких ограничений UNIQUE. Напомним, что только колонки первичного ключа и колонки с ограничениями UNIQUE является допустимыми потенциальными ключами. Таблица inventory содержит ограничение FOREIGN KEY, определенное по ее колонке item_id. С помощью этого ограничения создается связь по внешнему ключу между этими двумя таблицами. Обе связанные колонки имеют тип данных smallint. Ограничение FOREIGN KEY в таблице inventory по колонке item_id гарантирует, что в колонку item_id нельзя ввести никакое значение, если этого значения нет в колонке item_id таблицы items. Иными словами, если товар отсутствует в таблице items, то он не может присутствовать в таблице inventory. Кроме того, из таблицы items нельзя удалить строку, если на нее имеется ссылка из какой-либо строки в таблице inventory. Иными словами, если какой-либо товар присутствует в таблице items и таблице inventory, этот товар нельзя удалить из таблицы items, пока он присутствует в таблице inventory. Теперь вы, вероятно, поняли, что внешние ключи используются для поддержки согласованности базы данных. Например, в данном случае вам не нужна информация о допустимости какого-либо товара в таблицах, если не существует записи об этом товаре в таблице items, предназначенной для хранения записей по каждому имеющемуся товару.

    (рис 16.10) Схема базы данных, где показана связь по внешнему ключу между таблицами items и inventory

    Чтобы модифицировать ограничение FOREIGN KEY с помощью операторов T-SQL, вы должны сначала удалить старое ограничение и затем создать новое с помощью оператора ALTER TABLE. Этот метод действует аналогично модифицированию ограничения PRIMARY KEY. Ниже приводятся операторы для удаления исходного ограничения по таблице inventory и последующего добавления нового ограничения:

    ALTER TABLE inventory
    DROP CONSTRAINT FK_item_id 
    GO 
    
    ALTER TABLE inventory 
    ADD CONSTRAINT FK_item_id FOREIGN KEY (item_id)  
    REFERENCES items(item_id) 
    GO

    Если вы добавляете ограничение FOREIGN KEY к существующей колонке таблицы, SQL Server проверяет существующие строки таблицы, чтобы убедиться в том, что для значений этой колонки (за исключением null -значений) имеются соответствующие значения в колонке с ограничением PRIMARY KEY или UNIQUE ссылочной таблицы. Чтобы создать ограничение FOREIGN KEY без проверки системой SQL Server совпадения с существующими значениями, вы должны использовать опцию WITH NOCHECK оператора ALTER TABLE, как это показано ниже:

    ALTER TABLE inventory
    WITH NOCHECK ADD CONSTRAINT FK_item_id  
    FOREIGN KEY (item_id) 
    REFERENCES items(item_id) 
    GO

    Опция WITH NOCHECK препятствует тому, чтобы SQL Server проверял существующие строки таблицы, и это позволяет добавить соответствующее ограничение к таблице независимо от существующих значений. После добавления этого ограничения SQL Server обеспечивает целостность по внешнему ключу для новых строк.

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

    Вы можете также активизировать или отключать использование ограничения FOREIGN KEY. Если вы хотите ввести строку, которая не согласуется с существующим ограничением, то можете временно отключить это ограничение, ввести строку и затем снова активизировать ограничение. Ключевое слово NOCHECK указывает, что данное ограничение следует игнорировать (отключить), а ключевое слово CHECK указывает, что ограничение следует активизировать. Следующие операторы выполняют отключение и повторную активизацию ограничения FOREIGN KEY с помощью ключевых слов NOCHECK и CHECK:

    ALTER TABLE inventory
    NOCHECK CONSTRAINT FK_item_id    	--Отключает ограничение
    GO
    
    —Здесь должен быть оператор INSERT
    GO
    
    ALTER TABLE inventory          
    CHECK CONSTRAINT FK_item_id      	--Повторно активизирует ограничение
    GO
    Внимание. Вам не следует выполнять вставку строки данных, не согласующейся с ограничением FOREIGN KEY, если это не является крайней необходимостью. Если вы все же сделаете это, то, возможно, не сможете выполнять дальнейшие обновления.

    Ограничение CHECK

    Ограничение CHECK используется, чтобы ограничить множество допустимых для колонки значений определенными значениями. Значения, которые используются при вставке в колонку или обновлении колонки, проверяются на истинность (значение TRUE ) указанного в ограничении булева условия поиска. Например, если бы нам нужно было ограничить диапазон возможных значений, допустимых для колонки price (цена) таблицы items, величинами от $0,01 до $500,00, то мы использовали бы следующий оператор:

    CREATE TABLE items
    ( 
    item_name   		char(15)    	NOT NULL, 
    item_id     		smallint    	NOT NULL IDENTITY(1,1), 
    price       		smallmoney  	NULL, 
    item_desc   		varchar(30) 	NOT NULL DEFAULT 'none', 
    CONSTRAINT  	PK_item_id  	PRIMARY KEY (item_id), 
    CONSTRAINT  	CK_price    	CHECK (price >= .01 AND  
        						price <= 500.00) 
    ) 
    GO

    Отметим, что мы разрешили использование значений NULL в колонке price и задали ограничение CHECK по этой колонке. Поскольку SQL Server может отличить null -значение от любого другого типа значений, в колонке price, несмотря на ограничение CHECK, разрешены значения NULL. Кроме того, отметим, что мы присвоили этому ограничению имя CK_price. Как мы уже видели, присваивание имени ограничению упрощает последующее удаление и повторное создание этого ограничения по имени с помощью T-SQL. Например, чтобы изменить множество допустимых значений на диапазон от $1,00 до $1000,00, используйте следующий оператор:

    ALTER TABLE items
    DROP CONSTRAINT CK_price 
    GO 
     
    ALTER TABLE items 
    ADD CONSTRAINT CK_price CHECK (price >= 1.00 AND  
        	 price <= 1000.00) 
    GO

    Второй оператор ALTER TABLE имел бы такой же вид, если бы вы добавляли это ограничение к существующей таблице items в первый раз. При добавлении ограничения CHECK к существующей таблице применяются те же правила, что и при добавлении ограничения FOREIGN KEY. Существующие строки будут проверяться на соответствие этому ограничению. Если не все строки дают при проверке значение TRUE, то ограничение не добавляется к таблице и SQL Server возвращает сообщение об ошибке, информирующее, что оператор ALTER TABLE создает конфликтную ситуацию из-за ограничения CHECK. Если вы все же должны добавить это ограничение, используйте опцию WITH NOCHECK, чтобы указать, что должны проверяться только последующие обновления и добавляемые строки, но не существующие строки.

    Внимание. Использование опции WITH NOCHECK не рекомендуется, так как последующие обновления, возможно, не будут выполняться для строки, не согласующейся с ограничением.

    Вот пример использования WITH NOCHECK при добавлении ограничения CK_price:

    ALTER TABLE items
    WITH NOCHECK ADD CONSTRAINT CK_price  
    CHECK (price >= 1.00 AND price <= 1000.00) 
    GO

    Вы можете также активизировать и отключать ограничение CHECK (как и ограничение FOREIGN KEY ) с помощью ключевых слов CHECK и NOCHECK, используемых с командой ALTER TABLE. Вам может потребоваться этот метод, например, для вставки цены, выходящей за указанный диапазон. В следующем примере выполняется отключение и последующая повторная активизация ограничения CHECK с именем CK_price:

    ALTER TABLE items
    NOCHECK CONSTRAINT CK_price    	--Отключает ограничение     
    GO 
     
    --Здесь должен быть оператор INSERT
    GO 
    
    ALTER TABLE items
    CHECK CONSTRAINT CK_price      	--Повторно активизирует ограничение
    GO
    Примечание. CHECK и FOREIGN KEY – это единственные типы ограничений, которые можно отключать и активизировать таким способом.

    Создание и модифицирование ограничений с помощью Enterprise Manager

    В этом разделе вы узнаете, как создавать, модифицировать и удалять ограничения в Enterprise Manager с помощью окна Design Table и (в случае ограничений FOREIGN KEY ) с помощью схемы базы данных. (Инструкции по созданию схемы базы данных см. в лекции 15.) Окно Design Table появляется, когда вы создаете или редактируете таблицу с помощью Enterprise Manager. Чтобы создать таблицу, раскройте в левой панели Enterprise Manager папку сервера и папку базы данных, щелкните правой кнопкой мыши на папке Tables (Таблицы) и затем выберите из контекстного меню пункт New Table (Создать таблицу). Чтобы появилось окно Design Table для какой-либо существующей таблицы, сначала щелкните на папке Tables, щелкните правой кнопкой мыши на имени этой таблицы в правой панели и затем выберите из контекстного меню пункт Design Table.

    Разрешение использовать null-значения

    Чтобы указать, можно или нельзя использовать null -значения в какой-либо колонке, просто установите или сбросьте соответствующий флажок в колонке Allow Nulls (Разрешить null -значения) окна Design Table. Вы можете задать этот параметр при создании таблицы или при ее модифицировании. (Правила для разрешения null -значений см. в лекции 10.) На рис. 16.11 показано окно Design Table для таблицы customer (см. раздел "Создание и модифицирование ограничений с помощью T-SQL" выше в этой лекции). Как видно из рисунка, null -значения допускаются в колонках mid_init и cust_phone, но в остальных трех колонках не допускаются.

    (рис 16.11) Окно Design Table для таблицы customer с установленными флажками в столбце Allow Nulls.

    Ограничение UNIQUE

    Чтобы создать или модифицировать ограничение UNIQUE с помощью Enterprise Manager, выполните следующие шаги:

  • В панели инструментов окна Design Table щелкните на кнопке Table аnd Index Properties (Свойства таблицы и индексов) (кнопка справа от кнопки Save) и затем щелкните на вкладке Indexes/Keys (Индексы/Ключи) в появившемся окне Properties (Свойства). На рис. 16.12 показана вкладка Indexes/Keys окна Properties для таблицы customer. В этой вкладке будут представлены любые ограничения UNIQUE, поскольку они реализуются в виде уникальных индексов.

    Данная таблица создана с помощью следующего оператора, содержащего ограничение UNIQUE в виде кластеризованного индекса по колонке SSN. (SQL Server автоматически присвоил этому индексу имя UQ_customer_398D8EEE; именно поэтому удобнее присваивать ваши собственные имена ограничениям и индексам.)

    CREATE TABLE customer
    (
    first_name   		char(20) 	NOT NULL, 
    mid_init     		char(1)  	NULL, 
    last_name    		char(20) 	NOT NULL, 
    SSN          		char(11) 	NOT NULL UNIQUE CLUSTERED, 
    cust_phone   		char(10) 	NULL 
    ) 
    GO
    (рис 16.12) Вкладка Indexes/Keys окна Properties для таблицы customer
  • Создание нового ограничения UNIQUE начните со щелчка на кнопке New (Создать) вкладки Indexes/Keys окна Properties. Выберите имена колонок, которые хотите включить в ограничение, введите имя этого нового ограничения и затем установите флажок Create UNIQUE (Создать ограничение UNIQUE ). Установите флажок Create As CLUSTERED (Создать как кластеризованный индекс), если вы хотите, чтобы это был кластеризованный индекс по данной таблице, и задайте, если хотите, коэффициент заполнения (поле Fill factor). Если вы не хотите, чтобы SQL Server автоматически пересчитывал статистику по этому индексу через определенные периоды, установите также флажок Don’t automatically recompute statistics.
  • Вы можете использовать окно Properties для модифицирования ограничения UNIQUE ; например, вы можете изменять имя ограничения, указывать колонки, к которым присоединяется это ограничение, задавать ограничение как кластеризованный индекс и выбирать коэффициент заполнения для индекса. (О коэффициенте заполнения см. лекцию 17.) Внесите в это ограничение нужные вам изменения. По окончании щелкните на кнопке Close (Закрыть) и затем щелкните на кнопке Save в окне Design Table для сохранения ваших изменений.>
  • Ограничение PRIMARY KEY

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

  • В окне Design Table выберите колонку, щелкнув на одной из ячеек в ее строке. (Вы можете выбрать несколько колонок, удерживая клавишу Ctrl и щелкая на серых ячейках слева от имен колонок.)
  • Щелкните правой кнопкой мыши на одной из выбранных колонок и выберите из контекстного меню пункт Set Primary Key (Задать первичный ключ). Слева от колонок, которые вы задали для первичного ключа, появится изображение небольшого ключа. На рис. 16.13 показано окно Design Table для таблицы customer после указания колонки SSN как первичного ключа. Кроме того, из колонки SSN было удалено ограничение (рис 16.13) Задание ограничения PRIMARY KEY в окне Design Table
  • Если вам нужно переместить ограничение 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, выполните следующие шаги:

  • Щелкните правой кнопкой мыши на имени таблицы inventory в правой панели Enterprise Manager и выберите пункт Design Table. Щелкните правой кнопкой мыши на свободном месте этого окна и выберите из контекстного меню пункт Relationships (Связи). Появится окно Properties с открытой вкладкой Relationships (рис. 16.14).
  • Щелкните на кнопке New. Появится данные по умолчанию (рис. 16.15).
  • Мы выбираем для таблицы первичного ключа таблицу (рис 16.15) Вкладка Relationships (Связи) окна Properties (Свойства) для таблицы inventory(рис 16.14) Вкладка Relationships (Связи) с данными по умолчанию после щелчка на кнопке New (Создать)(рис 16.16) Вкладка Relationships, где показана связь по внешнему ключу между таблицами items и inventory
  • Внизу этого окна имеется несколько флажков (рис. 16.17). Установите флажок Check existing data on creation (Проверять существующие данные при создании), если вы хотите, чтобы SQL Server проверял существующие данные на связь по внешнему ключу. Если данные не согласуются, то ограничение не будет создано. Сбросьте этот флажок только в тех случаях, когда у вас еще нет данных или вы знаете, что существующие данные уже согласованы с этим ограничением, или вы не хотите по какой-либо причине, чтобы существующие данные были согласованы с ограничением. Но это может вызвать проблемы, если вы попытаетесь в дальнейшем обновить или удалить одну из существующих строк.
  • Следующий флажок – это Enable relationship for replication (Активизировать связь для репликации). Не устанавливайте его, если вы не используете репликацию. Но даже если вы используете репликацию, вам все же не нужно устанавливать этот флажок, поскольку данные будут проверяться на согласованность с данным ограничением уже в исходных таблицах, поэтому их не обязательно проверять при репликации. Если вы все же активизировали связь для репликации и если расписания репликации этих двух таблиц не синхронизированы в достаточной степени, то вы получите ошибки во время репликации, указывающие, что какая-либо строка не может быть реплицирована, поскольку в ней нарушено ограничение по внешнему ключу.
  • Следующий флажок – это Enable relationship for INSERT and UPDATE (Активизировать связь для операций INSERT и UPDATE). Установка этого флажка означает, что ограничение FOREIGN KEY будет проверяться при вставках и обновлениях, а также при удалениях. Если это является вашим намерением, установите данный флажок. Станут доступны два находящихся ниже флажка. Это флажки Cascade Update Related Fields (Каскадировать связанные с обновлением поля) и Cascade Delete Related Records (Каскадировать связанные с удалением записи). (Записью называется строка данных.)(рис 16.17) Вкладка Relationships, где показаны установленные флажки
  • Установка флажка 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". Работа оператора прекращена.)

  • Установка флажка 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". Работа оператора прекращена.)

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

    (рис 16.18) Схема базы данных для таблиц items и inventory

    Колонка item_id в таблице items – это колонка с первичным ключом (рис. 16.18). Это единственный "кандидат" для ссылки по внешнему ключу, так как для таблицы items не задано никаких ограничений UNIQUE. Чтобы создать связь по внешнему ключу между колонкой item_id таблицы inventory и колонкой item_id таблицы items, выполните следующие шаги.

  • Щелкните на крайней левой ячейке (серый квадрат) строки для колонки (рис 16.19) В Диалоговое окно Create Relationship (Создать связь), где показана предложенная связь по внешнему ключу
  • Если нужно, вы можете изменить имя этой связи. Установите или сбросьте флажки внизу этого диалогового окна, чтобы выбрать нужные вам опции. Эти флажки были описаны выше в этой лекции.
  • По окончании щелкните на кнопке OK, чтобы создать в схеме связь между таблицами (рис 16.20(рис 16.20) Схема базы данных, где показана связь по внешнему ключу
  • Щелкните на кнопке Save, чтобы сохранить ваши изменения. У вас будет запрошено имя схемы базы данных, и затем нужно будет подтвердить внесение изменений в соответствующие таблицы. Для завершения щелкните на кнопке Yes.
  • Чтобы модифицировать ограничение FOREIGN KEY, вы можете использовать аналогичным образом оба метода, описанных в данном разделе. В окне Design Table снова откройте вкладку Relationships, внесите изменения и сохраните свою работу. В схеме базы данных щелкните правой кнопкой мыши на линии связи по внешнему ключу и выберите пункт Properties для внесения изменений в соответствующее ограничение или выберите пункт Delete Relationship From Database (Удалить связь из базы данных), чтобы полностью удалить это ограничение. Если нужно, вы можете затем создать новое ограничение.

    Ограничение CHECK

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

  • Щелкните правой кнопкой мыши на окне Design Table и выберите из контекстного меню пункт Properties, чтобы появилось окно Properties. Щелкните на вкладке Check Constraints (Ограничения Check) (рис. 16.21) и щелкните на кнопке New для таблицы (рис 16.21) Вкладка Check Constraints (Ограничения Check) окна Properties
  • Далее введите выражение, которое хотите использовать для проверки данных, которые будут вводиться или обновляться. В нашем примере мы добавим ограничение CHECK по колонке price таблицы items, чтобы можно было помещать значения только от $1,00 до $1000,00 (рис. 16.22).
  • Обратите внимание на три флажка внизу этого окна. Установка флажка Check existing data on creation означает, что существующие данные таблицы будут проверяться на соответствие ограничению (рис 16.22) Добавление ограничения CHECK по колонке price таблицы items
  • Щелкните на кнопке Close и затем щелкните на кнопке Save, чтобы сохранить новое ограничение. Чтобы модифицировать ограничение CHECK, используйте вкладку Check Constraint для изменения имени (Constraint name), выражения (Constraint expression) и флажков. На рис. 16.23 ограничение CHECK по колонке price изменено, с диапазона от $1,00 до $1000,00 на диапазон от $1,00 до $99,00.
  • Отметим, флажок Check existing data on creation теперь сброшен, поскольку ограничение уже было создано. Если вы хотите проверить существующие данные на соответствие модифицированному диапазону, установите этот флажок. Если эта проверка не проходит для существующих данных, то вы получите сообщение об ошибке и ограничение не будет модифицировано.

    Вы можете также использовать вкладку Check Constraints для удаления ограничения CHECK, выбрав в списке Selected Constraint (Выбранное ограничение) имя ограничения, которое хотите удалить, и щелкнув на кнопке Delete.

    (рис 16.23) Модифицирование ограничения CHECK

    Объекты типа Rule

    Альтернативой использованию ограничения CHECK является создание объекта типа Rule (Rule-объекта) для ограничения значений, которые можно поместить или изменить в колонке. Rule-объект аналогичен Default-объекту в том, что он создается отдельно от таблицы и не удаляется при удалении таблицы. Вы должны также выполнить привязку Rule-объекта к колонке или к определенному пользователем типу – в данном случае – с помощью системной хранимой процедуры sp_bindrule. И, подобно Default-объекту, Rule-объекты включены в SQL Server 2000 для обратной совместимости с предыдущими версиями. Использование ограничения CHECK является предпочтительным методом ограничения значений колонок, но Rule-объекты полезно использовать, когда одно правило нужно использовать для нескольких колонок или определенных пользователем типов.

    Создание Rule-объекта с помощью T-SQL

    В качестве примера мы создадим Rule-объект, который выполняет ту же функцию, что и ограничение CHECK, которое мы создали выше. Наше правило использует имя переменной @price для ссылки на колонку price таблицы items. Имя переменной должно начинаться с символа "@", а имя можете выбрать произвольно. Сначала мы создадим данное правило и затем выполним его привязку к колонке, как это показано ниже:

    USE MyDB
    GO 
    CREATE RULE price_rule AS 
    (@price >= .01 AND @price <= 500.00) 
    GO 
    sp_bindrule 'price_rule', 'items.price', 'futureonly' 
    GO

    Для отмены привязки правила и его удаления используйте следующий оператор:

    sp_unbindrule 'items.price'
    GO 
    DROP RULE price_rule 
    GO

    Для процедур sp_bindrule и sp_unbindrule указываются те же параметры, что и для процедур sp_bindefault и sp_unbindefault (см. раздел "Оператор CREATE DEFAULT и процедура sp_bindefault" выше в этой лекции). Каждая колонка или определенный пользователем тип может иметь только одно правило, хотя вы можете одновременно присвоить одной колонке или определенному пользователем типу правило и одно или несколько ограничений CHECK. Если вы сделаете это, SQL Server будет применять правило и все ограничения к данным таблицы при их вставке или обновлении.

    Создание Rule-объекта с помощью Enterprise Manager

    Чтобы использовать Enterprise Manager для создания и привязки Rule-объекта, выполните следующие шаги.

  • Раскройте имя сервера и имя базы данных в Enterprise Manager. Щелкните правой кнопкой мыши на Rules (Правила) и затем выберите из контекстного меню пункт New Rule (Создать правило), чтобы появилось окно Rule Properties (Свойства правила). В данном примере мы зададим имя правила price_rule и добавим текст (рис 16.24(рис 16.24) Окно Rule Properties (Свойства правила) для создания правила
  • Для привязки правила щелкните на Rules в левой панели Enterprise Manager, щелкните правой кнопкой мыши на новом правиле и затем выберите из контекстного меню пункт Properties, чтобы появилось окно Rule Properties. Как и в случае привязки Default-объектов, щелкните на кнопке Bind UDTs для привязки данного правила к определенному пользователем типу или щелкните на Bind Columns для привязки данного правила к колонке или к колонкам. В данном примере мы щелкнем на кнопке Bind Columns и выберем колонку price таблицы (рис 16.25) Привязка правила к колонке
  • Щелкните на кнопке OK, чтобы применить ваше правило, и затем снова щелкните на кнопке OK, чтобы закрыть окно Rule Properties
  • Чтобы удалить правило, вы должны сначала отменить привязку правила ко всем колонкам или определенным пользователем типам. После отмены привязки правила щелкните правой кнопкой мыши на имени этого правила, выберите из контекстного меню пункт Delete и затем щелкните на кнопке Drop All в диалоговом окне Drop Objects. Если имеется привязка правила к какой-либо колонке, когда вы пытаетесь удалить его, то SQL Server выведет сообщение об ошибке и не удалит данное правило.

    Заключение

    В этой лекции вы узнали об умолчаниях и пяти типах ограничений, которые можно задать по колонке или таблице; вы также узнали, как создавать и модифицировать умолчания и ограничения с помощью T-SQL и Enterprise Manager. Кроме того, узнали, как создавать и модифицировать умолчания и правила с помощью Default-объектов и Rule-объектов. Умолчания позволяют задавать для колонки значение по умолчанию, когда не задано конкретное значение. Ограничения можно использовать различными способами для обеспечения целостности данных в вашей базе данных. Умолчания и ограничения является полезными средствами, если они продуманно применяются к вашим таблицам базы данных. В лекции 17 мы рассмотрим использование индексов в SQL Server, включая кластеризованные и некластеризованные индексы. Использование индексов может в огромной степени увеличить эффективность доступа к данным.

    Вернуться к учебному плану