Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных / БД2012 / Understanding.SQL.doc
Скачиваний:
281
Добавлен:
28.03.2015
Размер:
1.75 Mб
Скачать

Убедитесь что значения - уникальны

В Главе 17, мы обсудили использование уникальных индексов чтобы заставить пол иметь различные значения для каждой строки. Эта практика - осталась с прежних времен, когда SQL поддерживал ограничение UNIQUE. Уникальность - это свойство данных в таблице, и поэтому его более логично назвать как ограничение этих данных, а не просто как свойство логического отличия, связывающее объект данных ( индекс ). Несомненно, уникальные индексы - один из самых простых и наиболее эффективных методов предписания уникальности. По этой причине, не- которые реализации ограничения UNIQUE используют уникальные индексы; то есть они создают индекс не сообща вам об этом. Остается фактом, что вероятность беспорядка в базе данных достаточно мала, если вы предписываете уникальность вместе с ограничением.

Уникальность как ограничение столбца

Время от времени, вы хотите убедиться, что все значения, введенные в столбец, отличаются друг от друга. Например, первичные ключи достаточно ясно это показывают. Если вы помещаете ограничение столбца UNIQUE в поле при создании таблицы, база данных отклонит любую попытку ввода в это поле для од- ной из строк, значения, которое уже представлено в другой строке. Это ограничение может применяться только к полям которые были объявлены как непустые(NOT NULL), так как не имеет смысла позволить одной строке таблицы иметь значение NULL, а затем исключать другие строки с NULL значениями как дубликаты. Имеется дальнейшее усовершенствование нашей команды создания таб- лицы Продавцов :

CREATE TABLE Salespeople

( Snum integer NOT NULL UNIQUE,

Sname char (10) NOT NULL UNIQUE,

city char (10),

comm decimal );

Когда вы объявляете поле sname уникальным, убедитесь, что две Mary Smith будут введены различными способами - например, Mary Smith и M. Smith. В то же врем это не так уж необходимо с функциональной точки зрения - потому что поле snum в качестве первичного ключа, все равно обеспечит отличие этих двух строк - что проще для людей использующих данные в таблицах, чем помнить что эти Smith не идентичны. Столбцы ( не первичные ключи ) чьи значения требуют уникальности, называются ключами-кандидатами или уникальными ключами.

Уникальность как ограничение таблицы

Вы можете также определить группу полей как уникальную с помощью команды ограничения таблицы - UNIQUE. Объявление группы полей уни- кальной, отличается от объявления уникальными индивидуальных полей, так как это комбинация значений, а не просто индивидуальное значение, которое обязано быть уникальным. Уникальность группы - это представление порядка, так что бы пары строк со значениями столбцов "a", "b" и "b", "a" рассматривались отдельно од- на от другой. Наша база данных сделана так чтобы каждый заказчик был назначен од- ному и только одному продавцу. Это означает что каждая комбинация но- мера заказчика(cnum) и номера продавца(snum) в таблице Заказчиков должна быть уникальной. Вы можете убедиться в этом, создав таблицу Заказ- чиков таким способом:

CREATE TABLE Customers

( cnum integer NOT NULL,

cname char (10) NOT NULL,

city char (10),

rating integer,

snum integer NOT NULL,

UNIQUE (cnum, snum));

Обратите внимание что оба пол в ограничении таблицы UNIQUE все еще используют ограничение столбца - NOT NULL . Если бы мы использовали ограничение столбца UNIQUE для пол cnum, такое ограничение таблицы было бы необязательным. Если значения пол cnum различно для каждой строки, то не может быть двух строк с идентичной комбинацией значений полей cnum и snum. То же самое получится если мы объявим поле snum уникальным, хотя это и не будет соответствовать нашему примеру, так как продавец будет назначен многочисленным заказчикам. Следовательно, ограничение таблицы - UNIQUE, наиболее полезно когда вы не хотите заставлять индивидуальные пол быть уникальными. Предположим, например, что мы разработали таблицу чтобы следить за всеми порядками каждый день для каждого продавца. Каждая строка такой таблицы представляет сумму чисел любых порядков, а не просто индивиду- альный порядок. В этом случае, мы могли бы устранить некоторые возможные ошибки убедившись что на каждый день имеется не более чем одна строка для данного продавца, или что каждая комбинация полей snum и odate является уникальной. Вот как например мы могли бы создать таблицу с именем Salestotal :

CREATE TABLE Salestotal

( cnum integer NOT NULL,

odate date NULL,

totamt decimal,

UNIQUE (snum, odate));

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

INSERT INTO Salestotal

SELECT snum, odate, SUM (amt)

FROM Orders

GROUP BY snum, odate;

Соседние файлы в папке БД2012