Содержание
CREATE TABLE
Формат
CREATE TABLE <имя таблицы> [EXTERNAL [FILE] '<спецификация файла>'] (<определение столбца> [, <определение столбца> | <ограничение таблицы>]...); <определение столбца> ::= <имя столбца> { <тип данных> | <имя домена> | COMPUTED [BY] (<выражение>) | GENERATED ALWAYS AS (<выражение>) } [DEFAULT {<литерал> | NULL}] [NOT NULL] [<ограничение столбца>] [COLLATE <порядок сортировки>] <тип данных> ::= { SMALLINT [<размерность массива>] | INTEGER [<размерность массива>] | BIGINT [<размерность массива>] | FLOAT [<размерность массива>] | DOUBLE PRECISION [<размерность массива>] | {DECIMAL | NUMERIC} [(<точность> [, <масштаб>])] [<размерность массива>] | {DATE | TIME | TIMESTAMP} [<размерность массива>] | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(<целое>)] [CHARACTER SET <набор символов>] [<размерность массива>] | {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING] [(<целое>)]} [<размерность массива>] | BLOB [SUB_TYPE {<номер подтипа> | <имя подтипа>}] [SEGMENT SIZE <целое>] [CHARACTER SET <набор символов>]} | BLOB [(<размер сегмента> [, <номер подтипа>])] } <размерность массива> ::= [<целое 1>:<целое 2> [, <целое 1>:<целое 2>]...] <ограничение столбца> ::= [CONSTRAINT <имя ограничения>] { UNIQUE [<предложение USING>] | PRIMARY KEY [<предложение USING>] | REFERENCES <имя таблицы> [(<имя столбца>)] [<предложение USING>] [ON DELETE { NO ACTION | CASCADE | SET DEFAULT | SET NULL } ] [ON UPDATE { NO ACTION | CASCADE | SET DEFAULT | SET NULL } ] | CHECK (<условие столбца>) } <предложение USING> ::= USING [ASC[ENDING] | DESC[ENDING]] INDEX <имя индекса> <условие столбца> ::= { <значение> <оператор сравнения> {<значение> | (<выбор одного>)} | <значение> [NOT] IN (<значение> [, <значение>]... | <поиск одного>}) | <значение> [NOT] BETWEEN <значение> AND <значение> | <значение> [NOT] LIKE <значение> [ESCAPE '<символ>'] | <значение> IS [NOT] NULL | <значение> IS [NOT] DISTINCT FROM <значение> | <значение> <оператор сравнения> {ALL | SOME | ANY} (<поиск одного>) | EXISTS (<поиск многих>) | SINGULAR (<поиск многих>) | <значение> [NOT] CONTAINING <значение> | <значение> [NOT] STARTING [WITH] <значение> | (<условие столбца>) | NOT <условие столбца> | <условие столбца> OR <условие столбца> | <условие столбца> AND <условие столбца> }
Описание
Оператор CREATE TABLE
создает новую таблицу в базе данных.
Имя таблицы должно быть уникальным среди имен таблиц базы данных, хранимых процедур и представлений, описанных в этой базе данных.
Таблица может содержать, по меньшей мере, один столбец и произвольное количество ограничений таблицы. Таблица может не храниться в базе данных, все ее строки могут помещаться в отдельный текстовый файл, находящийся вне базы данных, заданный предложением EXTERNAL FILE
в операторе создания таблицы. В таблицах, которые хранятся во внешних файлах, могут быть описаны любые типы данных, кроме BLOB
. Недопустимо также использование массивов с любым типом данных. По отношению к таблицам, хранящимся во внешних файлах, допустимы только операции добавления новых строк (INSERT
) и выборки (SELECT
) данных. Операции же изменения существующих данных (UPDATE
) или удаления строк такой таблицы (DELETE
)не могут быть выполнены. Возможность использования для таблиц внешних файлов зависит от установки значения параметра ExternalFileAccess в файле конфигурации firebird.conf.
Все столбцы должны иметь имя, уникальное в данной таблице. Для столбца обязательно должен быть указан либо тип данных, либо имя домена, характеристики которого будут скопированы в этот столбец, либо должно быть указано, что столбец является вычисляемым (COMPUTED BY
или GENERATED ALWAYS AS
).
Для столбца с любым типом данных, кроме BLOB
, можно указать размерность массива, если этот столбец является массивом. При описании символьного столбца и столбца с типом данных BLOB
можно в предложении CHARACTER SET
указать набор символов, если требуется набор, отличный от набора символов по умолчанию, установленного для базы данных. В предложении COLLATE
можно задать порядок сортировки (для типа данных BLOB
использование COLLATE
недопустимо).
Если вместо типа данных задается имя домена, то все его характеристики копируются для этого столбца. Вычисляемый столбец задается предложением COMPUTED BY
. Значение такого столбца не хранится в таблице, а вычисляется каждый раз при выборке данных. Необязательное предложение DEFAULT
определяет значение по умолчанию для столбца — то значение, которое будет присвоено столбцу, если при помещении новой строки в таблицу в операторе INSERT не указан данный столбец и его значение. Значением по умолчанию может быть литерал, пустое значение NULL. Литералом может быть любая самоопределенная константа соответствующего типа, предварительно определенный литерал или контекстная переменная. Если значение по умолчанию явно не устанавливается, то подразумевается пустое значение, NULL
. Использование выражений в значении по умолчанию недопустимо. Необязательное предложение NOT NULL
указывает, что столбцу не может быть присвоено пустое значение. Ограничение столбца записывается после определения других характеристик столбца.
Существует четыре вида ограничений столбца: первичный ключ (PRIMARY KEY
), уникальный ключ (UNIQUE
), внешний ключ(REFERENCES
) и ограничение условия столбца CHECK
.
Необязательное предложение CONSTRAINT
задает имя ограничения. Если задано это предложение, то система автоматически строит индекс с этим именем для поддержания соответствующего ограничения (если в ограничении не было задано предложение USING
). Иначе ограничению и индексу присваивается системное имя.
- Ограничение
UNIQUE
определяет уникальный ключ: значение столбца должно быть уникальным — в таблице не должно существовать двух разных строк, имеющих одно и то же значение этого столбца. Уникальный ключ в отличие от первичного может иметь пустое значениеNULL
. Строк с пустым значением уникального ключа в таблице может быть произвольное количество. Таблица может содержать любое количество уникальных ключей. Для уникального ключа система автоматически создает индекс. Если ограничению при этом было назначено имя в предложенииCONSTRAINT
(при отсутствии предложенияUSING
), то это имя присваивается созданному индексу. Если же было задано и предложениеUSING
, то индекс для уникального ключа получает имя, указанное в этом предложении. В противном случае система присваивает индексу системное имя. - Ограничение
PRIMARY KEY
определяет первичный ключ. В таблице может быть только один первичный ключ. Столбец, являющийся первичным ключом, обязательно должен быть описан с указаниемNOT NULL
. Для первичного ключа система автоматически создает соответствующий индекс. Если ограничению было назначено имя в предложенииCONSTRAINT
(при отсутствии предложенияUSING
), то это имя присваивается созданному индексу. Если же было задано и предложениеUSING
, то индекс для первичного ключа получает имя, указанное в этом предложении. - Ограничение
REFERENCES
определяет внешний ключ. Внешний ключ должен иметь пустое значениеNULL
или же он должен ссылаться на первичный или уникальный ключ другой или той же самой таблицы (родительской таблицы). Для внешнего ключа система автоматически создает индекс. Если ограничению было назначено имя в предложенииCONSTRAINT
(при отсутствии предложенияUSING
), то это имя присваивается созданному индексу. Если же было задано и предложениеUSING
, то индекс для внешнего ключа получает имя, указанное в этом предложении.
Предложение USING
позволяет задать имя индекса для поддержания соответствующего ограничения и указать его упорядоченность — по возрастанию значений реквизитов (ASCENDING
) или по убыванию их значений (DESCENDING
). Если упорядоченность не задана, то предполагается ASCENDING
, по возрастанию. Предложение USING
может быть использовано для ограничений первичного ключа (PRIMARY KEY
), уникального ключа (UNIQUE
) и внешнего ключа (REFERENCES
). Упорядоченность индекса внешнего ключа должна соответствовать упорядоченности индекса первичного (уникального) ключа, на который ссылается данный внешний ключ.
Для ограничения CHECK
предложение USING
не применимо.
Предложение ON DELETE
определяет, что произойдет с записями подчиненной таблицы при удалении соответствующей строки главной таблицы:
NO ACTION
— не будет выполнено никаких действий; в клиентской программе должны быть предприняты специальные меры по поддержанию ссылочной целостности данных. Это может выполнять сама клиентская программ или для этого следует написать выполняемую хранимую процедуру, к которой должно осуществляться в процессе удаления строки обращение из клиентской программы, или специально созданный пользовательский триггер до удаления (BEFORE DELETE), выполняющий все необходимые установки;CASCADE
— в подчиненной таблице должны быть удалены все записи, имеющие те же значения внешнего ключа, что и значение первичного (уникального) ключа удаленной строки главной таблицы;SET DEFAULT
— значения внешнего ключа всех соответствующих строк в подчиненной таблице устанавливаются в значение по умолчанию, определенное в предложенииDEFAULT
этого столбца, описанного как внешний ключ. Если значение по умолчанию не указано, то столбцу присваивается значениеNULL
;SET NULL
— значения внешнего ключа всех соответствующих строк в подчиненной таблице устанавливаются в пустое значениеNULL
. Если это предложение отсутствует, то будет установленоRESTRICT
. Это означает, что из родительской таблицы нельзя удалить строку, для которой существуют строки в дочерней таблице, внешние ключи которых ссылаются на первичный (уникальный) ключ удаляемой строки.
Предложение ON UPDATE
определяет, что произойдет с записями подчиненной таблицы при изменении значения первичного/уникального ключа в строке главной таблицы;
NO ACTION
— не будет выполнено никаких действий; в программе должны быть предприняты специальные меры по поддержанию ссылочной целостности данных;CASCADE
— в подчиненной таблице должны быть изменены все значения внешнего ключа, имеющие те же значения, что и значение первичного (уникального) ключа изменяемой строки главной таблицы;SET DEFAULT
— значения внешнего ключа всех соответствующих строк в подчиненной таблице устанавливаются в значение по умолчанию, заданное в предложенииDEFAULT
для этого столбца;SET NULL
— значения внешнего ключа всех соответствующих строк в подчиненной таблице устанавливаются в пустое значениеNULL
. Если это предложение отсутствует, то будет установленоRESTRICT
. Это означает, что в родительской таблице нельзя изменить значение первичного (уникального) ключа, если в дочерней таблице существуют строки, внешние ключи которых ссылаются на первичный (уникальный) ключ изменяемой строки.
Ограничение CHECK
определяет условие, которому должно удовлетворять значение, помещаемое в данный столбец. Это логическое выражение, которое может возвращать значения TRUE
(истина), FALSE
(ложь) и UNKNOWN
(неопределенное, неизвестное значение). Это условие используется при добавлении в таблицу новой строки (оператор INSERT
) и при изменении существующего значения столбца таблицы (операторы UPDATE
или UPDATE OR INSERT
).
Оператором в этом условии является оператор сравнения.
<оператор сравнения> ::= = | < | > | <= | >= | !< | !> | <> | != | ^= | ^> | ^<
В операторе сравнения символы «!» и «^» означают отрицание. Оператор может быть применен к любому типу данных, за исключением типа данных BLOB. Допустимо сравнение однотипных или близких типов данных. При необходимости следует выполнить явное преобразование типа данных операндов сравнения, используя функцию CAST
.
Пример
CREATE TABLE EMPLOYEE (EMPNO CHAR(6) NOT NULL, FIRSTNME VARCHAR(12) NOT NULL, MIDINIT CHAR(1) NOT NULL, LASTNAME VARCHAR(15) NOT NULL, WORKDEPT CHAR(3) , PHONENO CHAR(4) , HIREDATE DATE , JOB CHAR(8) , EDLEVEL SMALLINT NOT NULL, SEX CHAR(1) , BIRTHDATE DATE , SALARY DECIMAL(9,2) , BONUS DECIMAL(9,2) , COMM DECIMAL(9,2) , PRIMARY KEY (EMPNO)) ALTER TABLE EMPLOYEE ADD FOREIGN KEY RED (WORKDEPT) REFERENCES DEPARTMENT ON DELETE SET NULL ALTER TABLE EMPLOYEE ADD CONSTRAINT NUMBER CHECK (PHONENO >= '0000' AND PHONENO <= '9999')
См. также
Источник
2009-04-10irebird\doc\
Обсуждение