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

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

Жанры

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

Борри Хелен

Шрифт:

. ! .

Переопределения в доменах

Столбцы, созданные с использованием доменов, могут переопределять некоторые наследуемые от домена атрибуты, заменяя наследуемый атрибут эквивалентным предложением атрибута. Определение столбца также может добавлять другие атрибуты. В табл. 13.1 описано, какие атрибуты могут, а какие не могут быть переопределены.

Таблица 13.1. Переопределение атрибутов доменов и столбцов

Атрибут

Переопределяется?

Замечания

Тип

данных

Нет

DEFAULT

Да

CHARACTER SET

Да

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

COLLATE

Да

CHECK

Нет

Используйте предложение CHECK в операторе CREATE или ALTER TABLE для добавления в проверку новых условий

NOT NULL

Нет

Атрибут NOT NULL на уровне домена не может быть переопределен на уровне столбца. Во многих случаях лучше оставить для домена возможность пустого значения и добавлять ограничение NOT NULL для столбцов, где это необходимо, в операторе CREATE или ALTER TABLE

Следующий оператор демонстрирует, как расширяется список атрибутов столбца, основанного на домене, созданного в одном из предыдущих примеров:

CREATE DOMAIN TEL_NUMBER

AS VARCHAR(18)

CHECK(VALUE LIKE '(0%)%');

Скажем, мы хотим определить таблицу, содержащую столбец с номером телефона. Нам нужны атрибуты домена, но нам также необходимо обеспечить, чтобы нецифровые символы вводились в верхнем регистре:

CREATE TABLE LIBRARY_USER (

USER_ID INTEGER NOT NULL.

. . . <другие столбцы>,

PHONE_NO TEL_NUMBER,

CONSTRAINT CHK_TELNUM_UPPER

CHECK (PHONE_NO = UPPER(PHONE_NO))

);

Теперь у нас есть дополнительная проверка CHECK для этого столбца. Следующий оператор:

INSERT INTO LIBRARY_USER VALUES (USER_ID, PHONE_NO)

VALUES (99, '(09) 43889 wish');

будет ошибочным, потому что дополнительное ограничение CHECK требует, чтобы телефонный номер был '(09) 43889 wish'.

Когда домены не работают

Домен не может быть использован:

* в функции CAST (<имя_домена> AS <другой_тип>);

* вместо явного типа данных при определении входных и выходных аргументов хранимых процедур;

* при объявлении типа данных локальной переменной в триггере или хранимой процедуре;

* при определении типа данных элементов массива. При этом сам домен может быть массивом.

Объявление домена BOOLEAN

Firebird не поддерживает тип данных BOOLEAN. Домены в стиле BOOLEAN являются идеалом, потому что вы можете объявлять атрибуты, которые будут постоянными для всех таблиц. Рекомендуется использование минимальных типов данных: CHAR для переключателя T[rue]/F[aise] или Y[es]/N[о] или SMALLINT для пары 1/0. Следующие примеры предлагают способы, которыми вы можете реализовать ваши типы BOOLEAN.

Пример 13.1. Двухфазный переключатель со значением по умолчанию 'F' (False)

CREATE DOMAIN D_BOOLEAN AS CHAR

DEFAULT 'F' NOT NULL

CHECK(VALUE IN ('T', 'F'));

Пример 13.2.

Трехфазный переключатель, допускающий значение UNKNOWN (т. е. NULL):

CREATE DOMAIN D_LOGICAL AS SMALLINT

CHECK(VALUE IS NULL OR VALUE IN (1,0));

Пример 13.3. Трехфазный переключатель, представляющий UNKNOWN как значение:

CREATE DOMAIN D_GENDER AS CHAR(4)

DEFAULT 'N/K' NOT NULL

CHECK (VALUE IN ('FEM', 'MASC', 'N/K'));

! ! !

ВНИМАНИЕ! He используйте BOOLEAN, UNKNOWN, TRUE или FALSE В качестве имен для булевых доменов. В Firebird это зарезервированные слова. Истинно логические типы планируются в Firebird 2 и могут появиться в промежуточных релизах между 1.5 и 2.

. ! .

Изменение определения домена

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

Домен может быть изменен его создателем, пользователем SYSDBA или (в Linux/UNIX) любым пользователем с привилегией root операционной системы.

Используя ALTER DOMAIN, вы можете:

* переименовать домен;

* изменить тип данных;

* удалить существующее значение по умолчанию;

* установить новое значение по умолчанию;

* удалить существующее ограничение CHECK;

* добавить новое ограничение CHECK.

! ! !

ПРИМЕЧАНИЕ. Существует только один путь "изменить" установку NOT NULL для домена - это удалить домен и заново создать его с желаемой комбинацией характеристик.

. ! .

Вот синтаксис оператора:

ALTER DOMAIN { имя | старое-имя ТО новое-имя } {

[SET DEFAULT {литерал | NULL | USER | etc.}]

| [DROP DEFAULT]

| [ADD [CONSTRAINT] CHECK (<условия-соответствия>)]

| [DROP CONSTRAINT]

| TYPE тип-данных

};

Примеры

Этот оператор устанавливает новое значение по умолчанию для домена BOOK_GROUP:

ALTER DOMAIN BOOK_GROUP SET DEFAULT -1;

В следующем операторе имя домена BOOK_GROUP заменяется на PUBL_GROUP:

ALTER DOMAIN BOOK_GROUP TO PUBL_GROUP;

Ограничения на изменение типов данных

Предложение TYPE в ALTER DOMAIN позволяет заменить тип данных на другой разрешенный тип данных. Разрешенные типы преобразований см. на рис. 8.1.

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

Преобразование числового типа данных в символьный тип требует минимальной длины для символьного типа, как указано в табл. 8.3.

31

При изменении типов домена учитывайте, что в хранимых данных могут быть данные, которые не пройдут преобразование из одного типа в другой. Например, VARCHAR В INTEGER сконвертируется, только если VARCHAR будет содержать цифры и числа, допустимые для INTEGER - Прим. науч. ред.

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

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

Неудержимый. Книга XVIII

Боярский Андрей
18. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVIII

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Шаман. Похищенные

Калбазов Константин Георгиевич
1. Шаман
Фантастика:
боевая фантастика
попаданцы
6.44
рейтинг книги
Шаман. Похищенные

Совок

Агарев Вадим
1. Совок
Фантастика:
фэнтези
детективная фантастика
попаданцы
8.13
рейтинг книги
Совок

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Ведьма Вильхельма

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
8.67
рейтинг книги
Ведьма Вильхельма

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

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

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

Плохая невеста

Шторм Елена
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Плохая невеста