Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

18

[i] ~ [j] Llj) 11 111 [1 В1j

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

мно31еество

допустимых

значений данных

Глава 18. Ограничеиия на множество допустимых значений данных

В главе 17 мы рассказали о создании таблиц. Теперь рассмотрим в деталях, как

определять ограничения на них. Ограничения (constraints) являются частью определе­ ния таблицы, в которой ограничиваются те значения, которые можно ввести в столбцы таблицы. До сих пор в этой книге предполагалось только одно ограничение на значе­ ния, которые можно вводить в таблицу: они должны иметь типы данных и размеры, со­ вместимые со столбцами, в которые эти значения вводятся (как определено в команде CREATE ТАВLЕ или ALTER TABLE). Ограничения открывают более существенные

возможности для управления данными.

Из этой главы вы узнаете, как задавать значения, принимаемые "по умолчанию", -

те, которые автоматически подставляются в столбец таблицы, когда его значение опу­ щено в команде INSERT для этой таблицы. Эта глава научит задавать значения "по умолчанию", среди которых наиболее часто используемое - NULL-значение. Значе­ ния, присваиваемые "по умолчанию", не являются ограничениями, но процедуры,

применяемые в их определении, сходны.

Ограничения в таблицах

Когда создается таблица (или когда она изменяется), можно определить ограниче­ ния на значения, которые вводятся в поля, и SQL будет отвергать любое из них, если оно не соответствует определенному критерию. Два основных типа ограничения - это ограничения на столбцы и на таблицу. Разница между ними состоит в том, что ог­ раничения на столбцы (соlитп constraints) применимы к только к отдельным столб­ цам, а ограничения на 111аб.1ицу (tаЫе const1·ai11ts) применимы к группам, состоящим из одного или более столбцов.

Объявление ограничений

Ограничения на столбец добавляются в конце определения столбца после указания типа данных и перед запятой. Ограничения на таблицу размещаются в конце опреде­ ления таблицы, после определения последнего столбца, перед закрывающей круглой скобкой. Команда CREATE TABLE имеет следующий синтаксис, расширенный вклю­

чением ограничений:

CREATE TABLE <имя таблицы>

(<имя столбца> <тип данных> <ограничения на столбец>,

<имя столбца> <тип данных> <ограничения на столбец> ...

<ограничения на таблицу> (<имя столбца>

[,<имя столбца>... ] ) ... ) ;

(Для большей ясности синтаксиса опущен аргумент размера, который иногда ис­ пользуется с типом данных.) Поля, заданные в круглых скобках после ограничений

186

NULL-

Ограничения в таблицах

таблицы, - это поля, на которые эти ограничения распространяются. Ограничения на столбцы применяются к тем столбцам, за которыми они следуют. Далее вы познакоми­

тесь с описанием различных типов ограничений и их использованием.

Использование ограничений для исключения NULL-

значения

Для того чтобы запретить использование NULL-значений в поле, можно приме­ нить команду CREATE TABLE, указав ключевое слово NOT NULL. Это ограничение распространяется только на множество столбцов.

NULL - специальный символ, обозначающий, что поле пусто. Но он полезен не всегда. Первичные ключи никогда не содержат NULL-значений, поскольку это нару­ шило бы функциональную зависимость. Во многих случаях необходимо, чтобы поля содержали определенные значения. Например, вам может потребоваться, чтобы в поле паше таблицы Customers обязательно бьmо указано имя покупателя.

Если ключевое слово NOT NULL размещается непосредственно после типа дан­

ных (включая размер) столбца, то любые попытки ввести NULL-значения в поле будут отвергнуты. В противном случае SQL разрешит использовать

значения.

Например, необходимо улучшить определение таблицы Sa\espeople, запретив ис­ пользование NULL-значений для столбцов snum и sname:

CREATE TABLE Salespeople

(snum integer NOT NULL,

sname char(10) NOT NULL,

city char(10),

comm decimal);

Важно помнить, что для каждого столбца, имеющего ограничение NOT NULL, в предложении INSERT для этой таблицы должно быть указано значение. При отсутст­ вии NULL-значений в эти столбцы не будет введено никакого значения, если только не указано значение по умолчанию (о котором мы расскажем здесь позже).

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

187

Глава 18. Ограничения на мно:жество допустимых значений данных

Какубедиться в том, что значения являются

уникшzьпыми

В главе 17 обсуждалось использование уникальных индексов для отслеживания

ситуации, когда поля имеют различные значения в различных строках. Такая практика

сложилась в SQL с появлением ограничения UNIQUE. Уникальность - это свойство данных в таблице, и естественнее определить его не логическим свойством объекта данных (индексом), а ограничением на данные.

Уникальные индексы являются одним из наиболее эффективных методов поддерж­

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

раничение UNIQUE с уникальными индексами: оно создает индекс, не сообщая об

этом пользователю. Если ограничение уникальности задано, появляется меньше шан­

сов попасть в непредвиденную или противоречивую ситуацию.

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

Salespeople:

CREATE TABLE Salespeople

(snum

integer

NOT

NULL

UNIQUE,

sname

char(10)

NOT

NULL

UNIQUE,

city

char( 10),

 

 

comm

decimal);

 

 

Объявляя поле sname уникальным, вы можете быть уверены, что две разные Магу Smitl1 будут введены различными способами, например: Mary Smith и М. Smith. Это не является необходимым с точки зрения функциональной зависимости - поле snum, как первичный ключ, обеспечивает различие двух строк; но с точки зрения использо­

вания данных может оказаться полезным различать две личности указанием их раз­

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

keys) или у11икальны.11и клЮЧ(ШU (unique keys).

Уникальность как ограничение таблицы. Можно сделать группу полей уни­ кальными, указав в качестве ограничения таблицы UNIQUE. Определение группы столбцов уникальными отличается от определения уникальным одного столбца тем, что комбинация значений, каждое из которых не является уникальным, мо­ жет быть уникальной. При объединении в группу важен порядок. Например, зна-

188

Ограиичения в таблицах

чения столбцов 'а', Ъ' и Ъ', 'а' отличаются друг от друга (дают две различные комбинации).

База данных разрабатывается в предположении, что каждому покупателю назначен только один продавец. Это означает, что каждая комбинация номера покупателя

(customer number) и номера продавца (salespeople number) в таблице Customers являет­

ся уникальной. Можно удостовериться в этом, задав определение таблицы Customers таким образом:

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 на столбец cnuin, то ограничение на таблицу не было бы необходимым. Если поле cnum различно для каждой строки, то не может быть двух строк с одинаковыми комбинациями cnum и snum. То же рассуждение было бы справедливым, если бы было объявлено уникаль­

ным поле snum, хотя для данного случая этот вариант неприемлем: один продавец мо­

жет обслуживать множество покупателей. Следовательно, ограничение на таблицу UNIQUE является практически полезным, если не требуется поддерживать уникаль­ ность отдельных полей.

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

CREATE TABLE Salestotal

(snum,

integer

NOT NULL,

odate,

date NOT

NULL,

totamt,

decimal,

 

UNIQUE

(snum, odate));

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

INSERT INTO Salestotal

SELECT snum, odate, SUM (amt)

FROM Orders

GROUP ВУ snum, odate;

189

Источник: https://studfile.net/preview/16418473/