Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Оператор CREATE TABLE
Разделы на этой странице:
Оператор CREATE TABLE
В DDL для создания таблиц используется оператор CREATE TABLE. Его синтаксис:
CREATE TABLE таблица
[EXTERNAL [FILE] 'спецификация-файла']
(<определение-столбца>
[, <определение столбца>
| <ограничение-таблицы> ...]);
Самый первый основной аргумент в CREATE TABLE- идентификатор таблицы[41]. Он является обязательным и должен быть уникальным среди всех имен таблиц, просмотров и процедур базы данных, иначе вы не сможете создать таблицу. Вы также должны предоставить определение, по крайней мере, одного столбца.
Определение столбцов
Когда вы создаете таблицу в базе данных, ваша основная задача - определить различные атрибуты и ограничения для каждого столбца в этой таблице.
Синтаксис определения столбца:
<определение-столбца> = столбец
{тип-данных | COMPUTED [BY] (<выражение>) | домен}
[DEFAULT {литерал | NULL | USER} ]
[NOT NULL] [<ограничение-столбца>]
[COLLATE порядок-сортировки]
В следующем разделе описываются требуемые и необязательные атрибуты, которые вы можете определить для столбца.
Требуемые атрибуты
Приведем требуемые атрибуты.
* Идентификатор столбца (имя), уникальный среди столбцов этой таблицы.
* Одно из следующих:
• тип данных SQL;
• выражение для вычисляемого столбца;
• имя домена для столбцов, основанных на доменах. Столбцы разделяются запятыми, например:
CREATE TABLE PERSON (
PERSON_ID BIGINT NOT NULL,
FIRST_NAME VARCHAR (35),
LAST_NAMES VARCHAR (80),
FULL_NAME COMPUTED BY FIRST_NAME ||' '|| LAST_NAMES,
PHONE_NUMBER TEL_NUMBER) ;
Столбец FULL_NAME является вычисляемым столбцом, который вычисляется конкатенацией двух других описанных столбцов: FIRST_NAME и LAST_NAME. Мы вернемся к вычисляемым столбцам несколько позже. Ограничение NOT NULL применяется к PERSON ID, потому что мы хотим сделать его первичным ключом (детали рассмотрим позже).
Для столбца PHONE_NUMBER мы используем домен, который был определен в нашем примере в главе 13:
CREATE DOMAIN TEL_NUMBER
AS VARCHAR(18)
CHECK(VALUE LIKE ' (0%)%');
Столбцы, основанные на доменах
Если определение столбца основано на домене, оно может включать новое значение по умолчанию, дополнительные ограничения CHECK, предложение COLLATE, которые перекрывают значения, уже определенные в определении домена. Оно также может включать дополнительные атрибуты или ограничения столбца. Например, вы можете добавить ограничение NOT NULL для столбца, если домен его еще не содержит.
! ! !
ВНИМАНИЕ! Домен, который был определен как NOT NULL, не может быть переопределен на уровне столбца, как допускающий пустое значение.
. ! .
Например, следующий оператор создает таблицу COUNTRY, ссылающуюся на домен с именем COUNTRYNAME, который не имеет ограничения NOT NULL:
CREATE TABLE COUNTRY (
COUNTRY COUNTRYNAME NOT NULL PRIMARY KEY,
CURRENCY VARCHAR(10) NOT NULL);
Мы добавили ограничение NOT NULL в определение столбца COUNTRYNAME, потому что он будет первичным ключом таблицы COUNTRY.
Необязательные атрибуты
Следующие разделы описывают необязательные атрибуты столбца.
Значение DEFAULT
Определение значения по умолчанию может сэкономить время ввода данных и предотвратить ошибки ввода данных, когда новая строка добавляется в таблицу. Если строка добавляется без включения этого столбца в список столбцов, то значение по умолчанию - если определено - может быть автоматически записано в столбец. Основанный на домене столбец может включать значение по умолчанию, которое локально перекрывает значение по умолчанию, определенное для домена.
Например, возможным значением по умолчанию для столбца TIMESTAMP может быть контекстная переменная CURRENT_TIMESTAMP (серверная дата и время). В символьном столбце логического стиля (True/False) значение по умолчанию может быть установлено в ' F' , чтобы гарантировать, что допустимое, непустое значение будет записано в каждую новую строку.
Значение по умолчанию должно быть совместимым с типом данных столбца и должно согласовываться с любыми другими ограничениями этого столбца или лежащего в основе домена. Значение по умолчанию, соответствующее типу данных, может быть:
* константой (например, строкой, числом или датой);
* контекстной переменной (например, CURRENT_TIMESTAMP, CURRENT_USER[42], CURRENT_CONNECTION и т.д.);
* предварительно определенным литералом даты (таким как 'NOW', 'TOMORROW' и т.д.);
* NULL может быть установлен как значение по умолчанию только для столбцов, допускающих пустое значение[43]. Столбец, допускающий пустое значение, получает значение по умолчанию NULL автоматически, однако вам может понадобиться перекрыть нежелательное значение по умолчанию на уровне домена. Не объявляйте это значение по умолчанию для столбцов, имеющих ограничение NOT NULL.
! ! !
ВНИМАНИЕ! Когда вы полагаетесь на значение по умолчанию, вы должны понимать, что значение по умолчанию будет применяться только к добавлению новой строки и только если оператор INSERT не включает этот столбец со значением по умолчанию в список столбцов. Если ваше приложение включает этот столбец в оператор INSERT и передает NULL в списке значений, то NULL и будет сохранен, независимо от любого определенного значения по умолчанию. Если столбец не допускает пустых значений, то передача значения NULL всегда вызовет исключение.
. ! .
Следующий пример определяет столбец CREATED_BY, который имеет в качестве значения по умолчанию контекстную переменную CURRENT_USER:
CREATE TABLE ORDER (
ORDER_DATE DATE,
CREATED_BY VARCHAR (31) DEFAULT CUREENT_USER,
ORDER_AMOUNT DECIMAL(15,2));
Новая строка добавляется пользователем JILLIBEE; столбец CREATED_BY не указан в списке столбцов:
INSERT INTO ORDER (ORDER_DATE, ORDER_AMT)
VALUES ('15-SEP-2004', 1004.42);
Запрос к этой таблице:
SELECT * FROM ORDER;
. . .
ORDER_DATE CREATED_BY ORDER_AMOUNT
. . .
15-SEP-2004 JILLIBEE 1004.42
. . .
Предложение CHARACTER SET
Набор символов (CHARACTER SET) используется для индивидуального символьного столбца или текстового столбца BLOB, когда вы определяете столбец. Если вы не задаете набор символов, то столбец принимает набор символов домена, если определен, иначе он принимает набор символов по умолчанию для базы данных. Пример:
CREATE TABLE TITLES_RUSSIAN (
TITLE_ID BIGINT NOT NULL,
TITLE_EN VARCHAR(100),
TITLE VARCHAR(100) CHARACTER SET WIN1251);
Подробнее о наборах символов см. главу 11. Список доступных наборов символов представлен в приложении 8.
Предложение COLLATE
Предложение COLLATE может быть добавлено к столбцам CHAR и VARCHAR для перекрытия последовательности сортировки, определенной для набора символов столбца в домене, на котором основывается столбец. Последовательность сортировки не применима для типов BLOB.
Следующее расширение предыдущего примера включает предложение 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)) );
- DROP TABLE
- RECREATE TABLE
- Синтаксис для CREATE TABLE...EXTERNAL FILE
- Арифметические операторы
- 1.2.4. Операторы и приоритеты
- Chapter 6. Traversing of tables and chains
- Chapter 10. Iptables matches
- Chapter 11. Iptables targets and jumps
- Chapter 15. Graphical User Interfaces for Iptables
- Chapter 16. Commercial products based on Linux, iptables and netfilter
- Условные операторы
- Where to get iptables