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

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

Ограничение 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 ) с помощью схемы базы данных. (Инструкции по созданию схемы базы данных см. в "Управление таблицами с помощью T-SQL и Enterprise Manager" .) Окно Design Table появляется, когда вы создаете или редактируете таблицу с помощью Enterprise Manager. Чтобы создать таблицу, раскройте в левой панели Enterprise Manager папку сервера и папку базы данных, щелкните правой кнопкой мыши на папке Tables (Таблицы) и затем выберите из контекстного меню пункт New Table (Создать таблицу). Чтобы появилось окно Design Table для какой-либо существующей таблицы, сначала щелкните на папке Tables, щелкните правой кнопкой мыши на имени этой таблицы в правой панели и затем выберите из контекстного меню пункт Design Table.

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

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

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

увеличить изображение
Рис. 16.11. Окно Design Table для таблицы customer с установленными флажками в столбце Allow Nulls.
Ограничение UNIQUE

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

  1. В панели инструментов окна 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
    Вкладка Indexes/Keys окна Properties для таблицы customer

    Рис. 16.12. Вкладка Indexes/Keys окна Properties для таблицы customer
  2. Создание нового ограничения UNIQUE начните со щелчка на кнопке New (Создать) вкладки Indexes/Keys окна Properties. Выберите имена колонок, которые хотите включить в ограничение, введите имя этого нового ограничения и затем установите флажок Create UNIQUE (Создать ограничение UNIQUE ). Установите флажок Create As CLUSTERED (Создать как кластеризованный индекс), если вы хотите, чтобы это был кластеризованный индекс по данной таблице, и задайте, если хотите, коэффициент заполнения (поле Fill factor). Если вы не хотите, чтобы SQL Server автоматически пересчитывал статистику по этому индексу через определенные периоды, установите также флажок Don’t automatically recompute statistics.
  3. Вы можете использовать окно Properties для модифицирования ограничения UNIQUE ; например, вы можете изменять имя ограничения, указывать колонки, к которым присоединяется это ограничение, задавать ограничение как кластеризованный индекс и выбирать коэффициент заполнения для индекса. (О коэффициенте заполнения см. "Создание и использование индексов" .) Внесите в это ограничение нужные вам изменения. По окончании щелкните на кнопке Close (Закрыть) и затем щелкните на кнопке Save в окне Design Table для сохранения ваших изменений.>