Инструменты пользователя

Инструменты сайта


create_table

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Both sides previous revision Предыдущая версия
Следущая версия
Предыдущая версия
create_table [2009/04/17 18:14]
german
create_table [2009/07/29 08:25] (текущий)
Строка 1: Строка 1:
 +====== CREATE TABLE ======
  
 +
 +===== Формат =====
 +<​code>​
 +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 <​условие столбца>​
 +}
 +</​code>​
 +
 +===== Описание =====
 +Оператор ''​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''​). ​
 +
 +Оператором в этом условии является оператор сравнения.
 +<​code>​
 +<​оператор сравнения>​ ::= = | < | > | <= | >= | !< | !> | <> | != | ^= | ^> | ^<
 +</​code>​
 +В операторе сравнения символы «!» и «^» означают отрицание. Оператор может быть применен к любому типу данных,​ за исключением типа данных BLOB. Допустимо сравнение однотипных или близких типов данных. При необходимости следует выполнить явное преобразование типа данных операндов сравнения,​ используя функцию ''​CAST''​.
 +
 +===== Пример =====
 +<code sql>
 +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'​)
 +</​code>​
 +
 +===== См. также =====
 +[[ALTER TABLE]], [[DROP TABLE]]
 +
 +===== Источник =====
 +2009-04-10irebird\doc\
create_table.txt · Последние изменения: 2009/07/29 08:25 (внешнее изменение)