CREATE TABLE
CREATE TABLE
Создание новой таблицы.
Синтаксис
CREATE [ TEMPORARY | TEMP ] TABLE таблица (
{ поле тип [ограничение_поля [... ] ] | ограничение_таблицы }
[. ... ]
)
[ INHERITS (базовая_таблица [,...])]
ограничение_поля ::=
[ CONSTRAINT имя_ограничения_поля ]
{ NOT NULL | UNIQUE | PRIMARY KEY |
DEFAULT значение |
CHECK ( условие ) |
REFERENCES внешняя_таблица [ ( внешнее_поле ) ]
[ MATCH FULL | MATCH PARTIAL ]
[ ON DELETE операция ]
[ ON UPDATE операция ]
[ DEFERRABLE | NOT DEFERRABLE ]
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
}
ограничение_та6лицы ::=
[ CONSTRAINT имя_ограничения_таблицы ]
{ UNIQUE ( поле [. ...] ) |
PRIMARY KEY ( поле [. ...] ) |
CHECK ( условие ) |
FOREIGN KEY ( поле [. ... ] ) |
REFERENCES внешняя_таблица [ ( внешнее_поле [,...])]
[ MATCH FULL | MATCH PARTIAL ]
[ ON DELETE операция ]
[ ON UPDATE операция ]
[ DEFERRABLE | NOT DEFERRABLE ]
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
}
операция ::= { NO ACTION | RESTRICT | CASCADE | SET NULL | SET DEFAULT }
Параметры
- TEMPORARY TEMP. Признак временной таблицы. Таблица, созданная с ключевым словом TEMPORARY или TEMP, автоматически уничтожается в конце текущего сеанса. Все конструкции уровня таблицы (например, индексы и ограничения) уничтожаются в конце сеанса вместе с таблицей. Если имя временной таблицы совпадает с именем существующей таблицы, все ссылки на таблицу с этим именем на протяжении сеанса будут относиться к временной таблице. Иногда это вызывает проблемы, поскольку временная таблица косвенно замещает существующую таблицу в контексте текущего сеанса до момента ее уничтожения.
- таблица. Имя создаваемой таблицы.
- поле. Имя поля в новой таблице. Перечисляемые имена полей указываются в круглых скобках и разделяются запятыми.
- тип. Сразу же после имени пользователя указывается его тип — стандартный тип или массив одного из стандартных типов.
- ограничение_поля. Полное определение ограничения для данного поля. Ниже перечислены параметры ограничений полей.
- имя_ограничения_поля. Необязательное имя, присвоенное ограничению.
- NULL. Ключевое слово NULL разрешает, чтобы в поле хранилось псевдозначение NULL. Действует по умолчанию.
- NOT NULL. Поле не может содержать псевдозначение NULL. Ограничение NOT NULL эквивалентно ограничению CHECK (поле NOT NULL).
- UNIQUE. Ограничение гарантирует, что поле содержит только уникальные значения (без дубликатов). Автоматически устанавливается при создании уникального индекса для поля.
- PRIMARY KEY. Поле назначается первичным ключом таблицы и используется другими таблицами для однозначной идентификации записей. Ограничение первичного ключа эквивалентно установке ограничений UNIQUE и NOT NULL.
- DEFAULT. Значение по умолчанию, используемое в том случае, если значение поля не было указано в команде INSERT. Если значение по умолчанию не задано, поле заполняется псевдозначением NULL.
- CHECK. Значения поля проверяются на соответствие заданному условию. Если при выполнении команды INSERT или UPDATE условие не выполняется, операция вставки/модификации завершается неудачей.
- условие. Произвольное выражение, результатом которого является логическая величина. Указывается после секции CHECK.
- REFERENCES. Входные значения ограничиваемого поля сравниваются со значениями другого поля в заданной таблице (за дополнительной информацией о создании и использовании этого ограничения обращайтесь к главе 7).
- внешняя_таблица. Имя таблицы, используемой для проверки в ограничении внешнего ключа.
- внешнее_поле. Имя поля внешней таблицы, используемого для проверки в ограничении внешнего ключа. Поле должно принадлежать существующей таблице. Если имя поля не задано, используется первичный ключ заданной таблицы.
- MATCH FULL | MATCH PARTIAL. Секция MATCH указывает, разрешается ли смешивание псевдозначений NULL и «обычных» значений (отличных от NULL) при вставке в таблицу, у которой внешний ключ ссылается на несколько полей. Таким образом, на практике секция MATCH приносит пользу лишь в ограничениях таблиц, хотя формально она может использоваться и при ограничении полей. Конструкция MATCH FULL запрещает вставку данных, у которых часть полей внешнего ключа содержит NULL (кроме случая, когда NULL равны все поля). В PostgreSQL 7.1.x конструкция MATCH PARTIAL не поддерживается. Если секция MATCH отсутствует, считается, что поля NULL удовлетворяют ограничению.
- ON DELETE. При выполнении команды DELETE для заданной таблицы с ограничиваемым полем выполняется одна из следующих операций: NO ACTION -если удаление приводит к нарушению целостности ссылок, происходит ошибка (используется по умолчанию, когда операция не указана); RESTRICT — аналогично NO ACTION; CASCADE — удаление всех записей, содержащих ссылки на удаляемую запись, поэтому при каскадном удалении необходимо действовать очень осторожно; SET NULL — поля, содержащие ссылки на удаляемую запись, заменяются псевдозначениями NULL; SET DEFAULT — полям, содержащим ссылки на удаляемую запись, присваивается значение по умолчанию.
- ON UPDATE. При выполнении команды UPDATE для заданной таблицы выполняется одна из операций, описанных выше. По умолчанию также используется значение NO ACTION. При выборе операции CASCADE все записи, содержащие ссылки па обновляемую запись, обновляются новым значением (вместо удаления, как в случае с ON DELETE CASCADE).
- DEFERRABLE | NOT DEFERRABLE. Значение DEFERRABLE позволяет отложить выполнение ограничения до конца транзакции (вместо немедленного выполнения после выполнения команды). Значение NOT DEFERRABLE означает, что ограничение всегда проверяется сразу же после выполнения очередной команды. В этом случае пользователь не может отложить проверку ограничения до конца транзакции. По умолчанию выбирается именно этот вариант.
- INITIALLY DEFERRED | INITIALLY IMMEDIATE. Значение INITIALLY DEFERRED откладывает проверку ограничения до конца транзакции, а при установке значения INITIALLY IMMEDIATE проверка производится после каждой команды. По умолчанию используется значение INITIALLY IMMEDIATE.
Результаты
- CREATE. Сообщение выдается при успешном создании новой таблицы.
- ERROR: Relation 'таблица' already exists. Ошибка — таблица с заданным именем уже существует.
- ERROR: CREATE TABLE: attribute "поле" duplicated. Ошибка — поле включено в список дважды.
- ERROR: Unable to locate type name 'тип' in catalog. Ошибка — заданный тип поля не существует.
- ERROR: Illegal class name 'таблица'. Ошибка — имя таблицы начинается с префикса pg_.
Описание
Команда CREATE TABLE создает новую таблицу в текущей базе данных. Только что созданная таблица не содержит данных, а ее владельцем является пользователь, выполнивший команду CREATE TABLE.
В определении новой таблицы перечисляются все имена и типы полей (кроме полей, унаследованных от базовой таблицы). Имя таблицы может иметь длину до 31 символа и автоматически преобразуется к нижнему регистру, если оно не заключено в кавычки. Поле может относиться к стандартному типу данных (например, int4, char) или содержать массив (описывается стандартным типом данных с квадратными скобками — например, float4[]).
Для полей создаваемой таблицы могут устанавливаться разнообразные ограничения. Например, при установке ограничения NOT NULL поле не может содержать псевдозначений NULL.
ВНИМАНИЕ
Имена таблиц не могут совпадать с именами существующих типов данных и таблиц системного каталога. Более того, они даже не могут начинаться с префикса pg_, зарезервированного для системных таблиц.
Максимальное количество полей в таблице равно примерно 1600. С учетом проблем, связанных с размером записей, на практике это число оказывается несколько меньшим.
Дополнительная информация о создании таблиц приведена в главе 4. За информацией об ограничениях полей и таблиц обращайтесь к главе 7.