loading..
Русский    English
20:40
листать

Оператор ALTER TABLE

Можно выделить следующие уровни проверочных ограничений:

  •  уровень атрибута (столбца),
  •  уровень кортежа (строки),
  •  уровень отношения (таблицы).

В ограничении уровня столбца проверяется значение только одного отдельного столбца, другими словами, в ограничении данного типа имеется ссылка только на один столбец той таблицы, в определении которой содержится данное ограничение. Чтобы привести пример такого ограничения, вернёмся к схеме «Компьютерная фирма». В таблице Product в столбце type может находиться одно из трех значений. Мы можем запретить ввод любой другой информации в этот столбец при помощи такого ограничения:

  1. CHECK (type IN('printer', 'pc', 'laptop'))

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

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

В настоящий момент нас интересует добавление ограничения на столбец type, поэтому вначале приведём синтаксис оператора для добавления ограничения:

  1. ALTER TABLE <имя таблицы>
  2. ADD CONSTRAINT <имя ограничения> <ограничение>;

Давайте теперь добавим наше ограничение и проверим, как оно работает.

  1. ALTER TABLE Product
  2. ADD CONSTRAINT chk_type CHECK (type IN('pc', 'laptop', 'printer'));

Чтобы убедиться в том, что ограничение работает как мы того ожидаем, попробуем добавить модель нового типа:

  1. INSERT INTO Product VALUES('A', 1122, 'notebook');

Как и ожидалось, в ответ мы получим сообщение об ошибке:

The INSERT statement conflicted with the CHECK constraint "chk_type". The conflict occurred in database "learn", table "dbo.product", column 'type'. The statement has been terminated.

(Конфликт инструкции INSERT с ограничением CHECK "chk_type". Конфликт произошел в базе данных "learn", таблица "dbo.product", столбец 'type'. Выполнение данной инструкции было прервано.)

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

В качестве примера давайте запретим производителю Z выпускать что-либо помимо принтеров.

  1. ALTER TABLE Product
  2. ADD constraint chk_maker_Z CHECK ((maker='Z' AND type= 'printer') OR maker <>'Z');

Итак, ограничение проверяет, что модель в таблице Product должна быть принтером производителя Z (maker='Z' and type= 'printer') или любого другого производителя (но не Z).

Если мы попытаемся добавить модель ПК производителя Z,

  1. INSERT INTO Product VALUES('Z', 1122, 'PC');
то получим приведенное выше сообщение об ошибке, в котором вместо имени ограничения chk_type будет упомянуто ограничение chk_maker_Z. При этом модель принтера будет добавлена без проблем:

  1. INSERT INTO Product VALUES('Z', 1122, 'Printer');

Разумеется, другой производитель сможет выпускать все, что угодно:

  1. INSERT INTO Product VALUES('V', 1123, 'PC');


Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100