Следующее расширение предыдущего примера включает предложение COLLATE:
CREATE TABLE TITLES_RUSSIAN (
TITLE_ID BIGINT NOT NULL,
TITLE_EN VARCHAR(100),
TITLE VARCHAR(100) CHARACTER SET WIN1251 COLLATE PXW_CYRL);
! ! !
ВНИМАНИЕ! Будьте осторожны при применении предложения COLLATE К столбцам, которые должны быть индексированы. Максимальный размер индекса 252 байта может быть радикально уменьшен при некоторых последовательностях сортировки. Сначала проверьте! (Для COLLATE PXW_CYRL он уменьшается до 84 символов.)
. ! .
Подробности о последовательностях сортировки, доступных для каждого набора символов, см. в главе 11. Список доступных наборов символов и порядков сортировки см. в приложении 8.
! ! !
СОВЕТ. Вы можете получить собственный список, который может включать и более поздние последовательности сортировки, создав новую базу и выполнив запрос из разд. "Отображение доступных последовательностей сортировки" главы 11.
. ! .
Вычисляемые столбцы
Вычисляемые столбцы - это столбцы, чье значение вычисляется каждый раз, когда во время выполнения к столбцам происходит обращение. Это может быть удобный способ доступа к избыточным данным без отрицательных эффектов от их фактического хранения. Не удивительно, что такие столбцы не могут обрабатываться как обычные данные - см. ограничения, описанные позже в этом разделе.
Синтаксис:
<���имя-столбца> COMPUTED [BY] (<���выражение>);
Нет необходимости описывать тип данных (хотя это возможно) - Firebird вычислит его подходящим образом, выражение - любое скалярное выражение, допустимое для типов данных столбцов, входящих в состав выражения. Внешние функции прекрасны для использования, если вы уверены, что библиотеки этих функций существуют в готовом виде или могут быть скомпилированы для всех платформ, где может устанавливаться база данных. (Информацию о внешних функциях, также называемых UDF, см. в главе 21. Список общих функций представлен в приложении 1.)
Приведем другие существующие ограничения для вычисляемых столбцов.
* Любой столбец, к которому обращается выражение, должен быть определен до определения вычисляемого столбца, следовательно, полезной практикой является размещение вычисляемых столбцов последними.
* Вычисляемый столбец не может быть определен как массив или возвращать массив.
* Вы можете определить вычисляемый столбец BLOB, используя оператор SELECT для поиска столбца BLOB в другой таблице, но делать это настоятельно не рекомендуется.
* Вычисляемые столбцы не могут быть индексированы.
* Ограничения, помещенные для вычисляемого столбца, будут проигнорированы.
* Вычисляемые столбцы используются только для вывода и только для чтения. Включение их в операторы INSERT или UPDATE вызовет исключение.
! ! !
ВНИМАНИЕ! В качестве общего предупреждения: хотя возможно создание вычисляемого столбца с использованием оператора SELECT к другой таблице, эта практика должна быть исключена, поскольку добавляет нежелательные зависимости и может ухудшить производительность. Правильно нормализованная модель базы данных не требует такого.
. ! .
Примеры вычисляемых столбцов
Следующий оператор создает вычисляемый столбец FULL NAME путем конкатенации столбцов LAST_NAMES и FIRST_NAME.
CREATE TABLE PERSON (
PERSON_ID BIGINT NOT NULL,
FIRST_NAME VARCHAR(35) NOT NULL,
LAST_NAMES VARCHAR (80) NOT NULL,
FULL_NAME COMPUTED BY FIRST_NAME ||' ' || LAST_NAMES) ;
/**/
SELECT FULL_NAME FROM PERSON
WHERE LAST_NAMES STARTING WITH 'SMI';
FULL NAME
=============
Arthur Smiley
John Smith
Mary Smits
! ! !
ПРИМЕЧАНИЕ. Обратите внимание на ограничения NOT NULL В двух именах, объединяемых для вычисляемого столбца. Важно обращать внимание на такие детали в случае вычисляемых столбцов, потому что NULL как элемент конкатенации всегда будет давать результат NULL.
. ! .
Следующий оператор вычисляет два столбца с использованием контекстных переменных. Это может быть полезным для регистрации подробностей создания строки:
CREATE TABLE SNIFFIT
(SNIFFID INTEGER NOT NULL,
SNIFF COMPUTED BY (CURRENT_USER),
SNIFFDATE COMPUTED BY (CURRENT_TIMESTAMP));
/**/
SELECT FIRST 1 FROM SNIFFIT;
SNIFFID SNIFF SNIFFDATE
===== ===== =====
1 SYSDBA 2004-08-15 08:15:35.0000
Следующий пример создает таблицу с вычисляемым столбцом (NEW_PRICE), который использует ранее созданные определения для OLD_PRICE и PERCENT_CHANGE:
CREATE TABLE PRICE_HISTORY (
PRODUCT_ID D_IDENTITY NOT NULL, /* использует домен */
CHANGE_DATE DATE DEFAULT CURRENT_TIMESTAMP NOT NULL,
UPDATER_ID D_PERSON NOT NULL, /* использует домен */
OLD_PRICE DECIMAL(13,2) NOT NULL,
PERCENT_CHANGE DECIMAL (4, 2)
DEFAULT 0
NOT NULL
CHECK (PERCENT_CHANGE BETWEEN -50.00 AND 50.00);
NEW_PRICE COMPUTED BY
(OLD_PRICE + (OLD PRICE * PERCENT_CHANGE / 100)) );
Читать дальше