Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
17.04.2018
Размер:
164 Кб
Скачать
☆

Ограничение not null

Этот тип ограничений уже встречался в теме 1, когда в команде CREATE TABLE указывалось, что столбцы не должны содержать null-значений:

CREATE TABLE purchase (

product_name VARCHAR2(25) NOT NULL,

product_price NUMBER(4,2) NOT NULL,

purchase_date DATE

)

Команда изменения статуса существующего столбца на NOT NULL имеет следующий синтаксис:

ALTER TABLE имя_таблицы MODIFY (имя_столбца NOT NULL);

Таблица PERSON содержит столбцы FIRST_NAME и LAST_NAME; логично предположить, что без имени и фамилии информация о человеке будет неполной. Чтобы сделать эти столбцы обязательными, нужно ввести следующие команды:

ALTER TABLE person MODIFY (first_name NOT NULL);

ALTER TABLE person MODIFY (last_name NOT NULL);

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

Для таблицы PERSON необходимо создать ограничение уникальности, гарантирующее, что данная комбинация из имени и фамилии может вводиться только один раз. Но ограничение только по имени может быть неоправданно строгим. На свете много однофамильцев и тезок, и не исключено, что на работу будут приняты нескольких людей с одинаковыми именами. Решение состоит в том, чтобы включить в ограничение дату приёма на работу, поскольку маловероятно, что два человека с одним и тем же именем будут наняты в один день.

Создание ограничения, гарантирующего уникальность значений, задается оператором

ALTER TABLE имя_таблицы

ADD CONSTRAINT имя_ограничения UNIQUE (имена_столбцов) ;

Применив этот синтаксис к рассматриваемой ситуации, получим приведенный ниже код:

ALTER TABLE person

ADD CONSTANT person_unique UNIQUE ( first_name, last_name, hire_date );

Cообщение об ошибке, связанной с нарушением ограничения, содержит имя ограничения. Учитывая это, желательно присваивать ограничениям максимально информативные имена (в пределах 30 символов, допускаемых для имени). Рекомендуется начинать имя ограничения с имени таблицы, а затем указывать назначение ограничения.

Когда создается ограничение уникальности, Oracle неявно создает уникальный индекс (unique index). Этот индекс содержит столбцы, указанные в команде ALTER TABLE...ADD CONSTRAINT, а его имя совпадает с именем ограничения. Уникальный индекс помогает Oracle идентифицировать повторяющиеся записи. Создавая этот индекс, Oracle считывает все существующие записи таблицы и представляет их в индексе. По этой причине создание ограничения уникальности будет успешным только в том случае, если оно не нарушается текущими записями таблицы. Если таблица содержит записи с повторяющимися значениями в указанных вами столбцах, то в ответ на команду ALTER TABLE...ADD CONSTRAINT будет выдано сообщение об ошибке с объяснением проблемы.

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

Контрольное ограничение (check constraint) позволяет определить, каким условиям должны удовлетворять входные данные, чтобы Oracle разрешил их ввод. Контрольное ограничение можно определять для каждого столбца таблицы. Например, вы можете объявить, что значения в столбце с ценами должны быть положительными числами, и одновременно потребовать, чтобы значения в столбце с датами лежали в определенном диапазоне. Контрольные ограничения входят в число наиболее мощных инструментов, обеспечивающих чистоту хранимых данных.

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

ALTER TABLE имя_таблицы ADD

CONSTRAINT [имя_ограничения]

СНЕСК (имя_столбца условие) ;

Параметр имя_таблицы идентифицирует таблицу, столбцы которой должны контролироваться. Необязательный параметр имя_ограничения позволяет разработчику базы данных самостоятельно присвоить имя ограничению. Если опустить этот параметр, Oracle выберет имя автоматически, причем оно не будет нести какой-либо подсказывающей информации. Лучше присваивать имя вручную, чтобы при нарушении ограничения в сообщении об ошибке стояло именно заданное имя — предположительно, более информативное, чем присвоенное по умолчанию.

Параметр имя_столбца идентифицирует столбец, к которому относится ограничение. Параметр условие определяет, каким требованиям должны удовлетворять данные, чтобы попытка их вставки в таблицу была успешной. Все вместе эти параметры выглядят точно так же, как и условие поискав конструкции WHERE оператора SELECT.

В следующем примере таблица PURCHASE защищается от ввода неправильных данных путем контроля за датами покупок. (Здесь задается первую "разумная" дата как 30 июля 2007 года. На практике определение такой даты зависит от приложения.) В этом примере следует отметить несколько моментов:

• контрольное ограничение проверяет два различных условия, прежде чем разрешить вставку данных. Эти условия соединены ключевым словом AND;

• первое условие гарантирует, что столбец будет содержать значение (если не включить это условие, будут проверяться только записи, содержащие значение в столбце ограничения, тем самым разрешая вставку записей с null-значениями в этом столбце);

• во втором условии имя столбца подставлено в функцию TO_CHAR. Это обусловлено особенностью используемой версии Oracle, приводящей к выдаче сообщения об ошибке при попытке сослаться в контрольном ограничении непосредственно на столбец с датами. Чтобы обойти эту особенность, необходимо преобразовать дату в текст и проверять ее в этом формате. Однако при сравнении текстовых строк февраль ("FЕВ") будет идти раньше января ("JAN"), поскольку в алфавите "F" стоит перед "J". Решение состоит в том, чтобы отформатировать столбец и дату в ограничении как числа, поставив на первое место год, затем месяц (в числовом виде) и в конце — день:

ALTER TABLE purchase ADD (

CONSTRAINT reasonable_date CHECK(

purchase_date IS NOT NULL

AND

TO_CHAR(purchase_date, ' YYYY-MM-DD' ) >= '2007-06-30'

)

) ;

В некоторых случаях желательно установить на столбец контрольное ограничение, но разрешить null-значения; иначе говоря, столбец может быть пустым, но если он содержит значение, то оно должно удовлетворять одному или нескольким условиям. По умолчанию Oracle интерпретирует контрольные ограничения именно так. Пока вы не укажете конструкцию IS NOT NULL, null-значения будут приниматься. Чтобы увидеть, как это происходит, можно введите следующие команды:

ALTER TABLE product ADD (

CONSTRAINT reasonable_stock_date CHECK(

TO_CHAR(last_stock_date, 'YYYY-MM-DD') >= '2006-12-31'

)

);

INSERT INTO product VALUES ( 'Anodized Framifier', 49, 5, NULL ) ;

INSERT INTO product VALUES ( 'Spring-Loaded Pit Puller', 49, 5, '30-DEC-06' ) ;

Чтобы задать контрольное ограничение, не обязательно ждать, пока будет создана таблица; это можно сделать одновременно с ее созданием. Информация об ограничении добавляется к определению соответствующего столбца после типа данных и опции NULL, как показано в приведенном ниже фрагменте кода:

CREATE TABLE person (

person_code VARCHAR2(3) NULL,

first_name VARCHAR2(15) NOT NULL,

last_name VARCHAR2(20) NOT NULL,

hire_date DATE NULL

CONSTRAINT reasonable_hire_date CHECK (

TO_CHAR(hire_date, 'YYYY-MM-DD') >= '1960-01-01'

)

) ;

CREATE TABLE product (

product_name VARCHAR2(25) NULL,

product_price NUMBER(4,2) NULL

CONSTRAINT validjorice CHECK "(

product_price BETWEEN 0 AND 10000

),

quantity_on_hand NUMBER(5) NULL

CONSTRAINT positive_quantity CHECK (

quantity_on_hand >= 0

),

last_stock_date DATE NULL

CONSTRAINT reasonable_stock_date CHECK (

TO_CHAR(last_stock_date, 'YYYY-MM-DD')>= '2006-12-31'

)

) ;

Можно определить контрольное ограничение, сравнивающее значения в более чем одном столбце. Это полезно для "проверки на реалистичность" тех значений, которые имеют некоторую логическую связь друг с другом. Ни одна из созданных к этому моменту таблиц не содержит столбцов, подходящих для такой проверки. В приведенном ниже примере показано, как создать ограничение для фиктивной таблицы EMPLOYEE, гарантирующее, что текущая зарплата служащего не меньше его прошлогодней зарплаты, но и не превышает ее более чем на 25%:

ALTER TABLE employee ADD (CONSTRAINT realistic_current_salary CHECK (

salary BETWEEN prior_year_salary AND (prior_year_salary*1.25) ) ) ;

Соседние файлы в папке лекции оракл