Шрифт:
Для столбца 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.
Следующие разделы описывают необязательные атрибуты столбца.
Определение значения по умолчанию может сэкономить время ввода данных и предотвратить ошибки ввода данных, когда новая строка добавляется в таблицу. Если строка добавляется без включения этого столбца в список столбцов, то значение по умолчанию - если определено - может быть автоматически записано в столбец. Основанный на домене столбец может включать значение по умолчанию, которое локально перекрывает значение по умолчанию, определенное для домена.
Например, возможным значением по умолчанию для столбца TIMESTAMP может быть контекстная переменная CURRENT_TIMESTAMP (серверная дата и время). В символьном столбце логического стиля (True/False) значение по умолчанию может быть установлено в ' F' , чтобы гарантировать, что допустимое, непустое значение будет записано в каждую новую строку.
Значение по умолчанию должно быть совместимым с типом данных столбца и должно согласовываться с любыми другими ограничениями этого столбца или лежащего в основе домена. Значение по умолчанию, соответствующее типу данных, может быть:
* константой (например, строкой, числом или датой);
* контекстной переменной (например, CURRENT_TIMESTAMP, CURRENT_USER [42] , CURRENT_CONNECTION и т.д.);
* предварительно определенным литералом даты (таким как 'NOW', 'TOMORROW' и т.д.);
* NULL может быть установлен как значение по умолчанию только для столбцов, допускающих пустое значение [43] . Столбец, допускающий пустое значение, получает значение по умолчанию NULL автоматически, однако вам может понадобиться перекрыть нежелательное значение по умолчанию на уровне домена. Не объявляйте это значение по умолчанию для столбцов, имеющих ограничение NOT NULL.
42
Если ваша операционная система поддерживает использование многобайтовых символов в именах пользователей или вы используете многобайтовый набор символов при определении ролей, то каждый столбец, в котором будут сохраняться в качестве значений по умолчанию CURRENT_USER или CURRENT_ROLE, должен быть определен с использованием совместимого набора символов.
43
См. ограничение NOT NULL для столбца, 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) используется для индивидуального символьного столбца или текстового столбца BLOB, когда вы определяете столбец. Если вы не задаете набор символов, то столбец принимает набор символов домена, если определен, иначе он принимает набор символов по умолчанию для базы данных. Пример: