Чтение онлайн

на главную - закладки

Жанры

Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Борри Хелен

Шрифт:

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

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

! ! !

СОВЕТ. Ограничения CHECK применяются после выполнения триггеров "before". Используйте триггер, если вы хотите выполнить проверку и присвоить данным допустимые значения.

. ! .

В

определении таблицы это ограничение на уровне таблицы. В отличие от ограничений CHECK, применимых к определению домена, его элемент VALUE является ссылкой на столбец. Например, для домена предложение CHECK может быть следующим:

CHECK(VALUE > 10)

В определении таблицы то же самое условие для столбца с именем ACOLUMN будет представлено как:

CHECK (ACOLUMN > 10)

Ограничение CHECK будет активным для операций INSERT и UPDATE. Хотя это ограничение на уровне таблицы, его область действия может выходить за пределы уровня столбца на уровень строки и, хотя это не рекомендуется, на уровень таблицы и даже за пределы таблицы. Ограничение CHECK гарантирует целостность данных, только если значения, включенные в проверку, находятся в той же самой строке, что и проверяемое значение.

! ! !

ВНИМАНИЕ! Вы не должны использовать выражения, которые сравнивают значение со значениями из других строк этой же таблицы или других таблиц, потому что любая строка, отличная от текущей, может находиться в процессе изменения или удаления в другой транзакции. В особенности не полагайтесь на ограничение CHECK для проверки ссылочных отношений!

. ! .

Условие поиска может:

* проверять, что вводимое значение находится в указанном диапазоне;

* проверять, что значение присутствует в списке допустимых значений;

* сравнивать значение с константой, выражением или со значением данных другого столбца из этой же строки.

Замечания по использованию CHECK

Существуют определенные условия использования ограничений CHECK.

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

* Ограничение CHECK для столбца, основанного на домене, не может перекрывать наследуемую от домена проверку. Определение столбца может использовать обычное предложение CHECK, чтобы добавить дополнительную логику ограничения в наследуемое ограничение. Оно будет соединено с наследуемым ограничением конъюнкцией (логической операцией И).

* Ограничение CHECK не может ссылаться на домен. Синтаксис ограничения CHECK:

CHECK (<условие-поиска>);

<условие-поиска> =

<val> <operator> {<val> | {<выбор-одного>) }

| <val> [NOT] BETWEEN <val> AND <val>

| <val> [NOT] LIKE <val> [ESCAPE <val>]

| <val> [NOT] IN (<val> [, <val> ...] | <список-выбора>)

| <val> IS [NOT] NULL

| <val> { [NOT] { = | < | > } |>=|<=}

{ ALL | SOME | ANY }(<список-выбора>)

| EXISTS (<выражение-выбора>)

| SINGULAR (<выражение-выбора>)

| <val> [NOT] CONTAINING <val>

| <val> [NOT] STARTING [WITH] <val>

| (<условие-поиска>)

| NOT <условие-поиска>

| <условие-поиска> OR <условие-поиска>

l <условие-поиска> AND <условие-поиска>

Диапазон

возможностей при определении ограничений CHECK действительно весьма широк - теоретически в нем может быть использовано почти любое условие поиска. Для разработчика важно выбрать разумные и безопасные условия, т. к. они действуют для каждой операции INSERT и UPDATE для таблицы.

В части V данной книги описывается синтаксис установки различных стилей условия поиска.

Пример. Следующее ограничение проверяет значения двух столбцов для гарантии, что одно больше другого. Хотя оно также предполагает условия NOT NULL для обоих столбцов - проверка будет ошибочной, если хотя бы один столбец будет иметь пустое значение, - оно не устанавливает ограничение NOT NULL для столбца:

CHECK (COL_1 > COL_2);

Проверка даст ошибку, если арифметическая проверка будет ошибочной или если любой из столбцов COL_1 или COL_2 имеет значение NULL. Следующая операция будет успешной:

INSERT INTO TABLE_1 (COL_1, COL_2) VALUES (6,5);

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

Ограничение UNIQUE, как и ограничение первичного ключа, гарантирует, что никакие две строки не будут иметь то же значение указанного столбца или группы столбцов. Вы можете объявить для таблицы более одного ограничения UNIQUE, но оно не может использовать тот же набор столбцов, который был использован для ограничения PRIMARY KEY или другого UNIQUE.

Ограничение UNIQUE фактически создает уникальный ключ, который виртуально имеет те же возможности, что и первичный ключ. Он может быть выбран как управляющий ключ для ограничения ссылочной целостности. Это делает его полезным в ситуациях, когда вы определяете небольшой суррогатный первичный ключ для его атомарности и улучшения производительности в соединениях и операциях поиска, но при этом хотите сохранить режим формирования альтернативной связи внешнего ключа с уникальным ключом для нерегулярного использования.

В Firebird 1.0.x атрибут NOT NULL должен быть применен для всех столбцов, с которыми оперирует ограничение UNIQUE.

Как и ограничение PRIMARY KEY, UNIQUE создает свой постоянный уникальный индекс для поддержания его правил. Правила именования ограничения и индекса соответствует тем же правилам поведения, применимым к другим ключам. Следующий пример isql иллюстрирует именование в Firebird 1.5:

SQL> CREATE TABLE TEST_UQ (

CON> ID BIGINT NOT NULL,

CON> DATA VARCHAR(10),

CON> DATA_ID BIGINT NOT NULL);

SQL> COMMIT;

SQL> ALTER TABLE TEST_UQ

CON>ADD CONSTRAINT PK_TEST_UQ PRIMARY KEY(ID),

CQN>ADD CONSTRAINT UQ1_DATA UNIQUE(DATA_ID) ;

SQL> COMMIT;

SQL> SHOW TABLE TEST_UQ;

ID BIGINT NOT NULL

DATA VARCHAR(10) NULLABLE

DATA_ID BIGINT NOT NULL

CONSTRAINT PK_TEST_UQ:

Primary key (ID)

CONSTRAINT UQ1_DATA:

Unique key (DATA_ID)

SQL> SHOW INDICES TEST_UQ;

Поделиться:
Популярные книги

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

О, мой бомж

Джема
1. Несвятая троица
Любовные романы:
современные любовные романы
5.00
рейтинг книги
О, мой бомж

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Вы не прошли собеседование

Олешкевич Надежда
1. Укротить миллионера
Любовные романы:
короткие любовные романы
5.00
рейтинг книги
Вы не прошли собеседование

Метаморфозы Катрин

Ром Полина
Фантастика:
фэнтези
8.26
рейтинг книги
Метаморфозы Катрин

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Попаданка для Дракона, или Жена любой ценой

Герр Ольга
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Попаданка для Дракона, или Жена любой ценой

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Сумеречный Стрелок 5

Карелин Сергей Витальевич
5. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 5

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Возвышение Меркурия. Книга 17

Кронос Александр
17. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 17

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

Волков. Гимназия №6

Пылаев Валерий
1. Волков
Фантастика:
попаданцы
альтернативная история
аниме
7.00
рейтинг книги
Волков. Гимназия №6

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки