Инструкция CREATE/ALTER TABLE советы и хитрости программирования
Пользователь, подающий команду CREATE TABLE, должен иметь соответствующие права доступа. Точно так же таблица, которую хочет изменить или удалить пользователь, должна принадлежать к его схеме или он должен иметь соответствующие права для изменения или удаления таблицы. Поскольку в стандарте ANSI не указываются необходимые привилегии, у разных производителей можно ожидать наличие вариаций.
Вы можете включать инструкции CREATE TABLE или ALTER TABLE в транзакцию с помощью инструкций COMMIT и ROLLBACK, завершая, таким образом, транзакции явным образом.
Вы можете хорошо контролировать способ физической записи таблиц на диск с помощью расширений стандарта ANSI. В DB2 и SQL Server для управления записью на диск используется метод, называемый кластеризованными индексами. В Oracle используется функционально сходный метод, называющийся «индекс-таблица» (index-organized table).
Некоторые базы данных блокируют таблицы, которые изменяются при помощи инструкций ALTER TABLE. Поэтому эту команду нужно выполнять только применительно к таблицам, которые не используются в рабочей базе данных.
В некоторых базах данных при использовании инструкции CREATE TABLE…LIKE блокируются и таблица-цель, и таблица-источник.
В DB2 поддерживается богатый и продуманный набор расширений инструкции CREATE TABLE.
CREATE TABLE имя_таблицы {(имя_столбца тип_данных атрибуты [, …]) |
OF имя_типа [{UNDER супертаблица INHERIT SELECT PRIVILEGES | HIERARCHY имя_иерархии}] [определение_таблицы] |
AS подзапрос {опции_производной_таблицы | DEFINITION ONLY [опции_копирования]} |
[LIKE имя_таблицы] [опции_копирования] | [[(вспомогательный_столбец [, …])]
FOR имя_таблицы PROPAGATE IMMEDIATE]} [ORGANIZE BY [DIMENSIONS] (имя_столбца [, …])] [DATA CAPTURE {NONE | CHANGES}]
[IN имя_табличной_области [INDEX IN имя_табличной_области]
[LONG IN имя_табличной_области]] [VALUE COMPRESSION] [WITH RESTRICT ON DROP] [NOT LOGGED INITIALLY]
[{REPLICATED | PARTITIONING KEY {имя_столбца [, …])
[USING HASHING]}] [OPTIONS (REMOTE_SERVER ‘ имя_сервера’)
[, REMOTE_SCHEMA ‘имя_схемы’]
[, REMOTE_TABNAME имя_таблицы’]]
Также богатая расширениями инструкция ALTER TABLE в DB2 позволяет вносить много полезных изменений в существующие таблицы без удаления существующих индексов, триггеров и допусков, связанных с ними.
ALTER TABLE имя_таблицы {[ADD {{[COLUMN] имя_столбца тип_данных атрибуты} |
табличное_ограничение | ключ_секционирования | RESTRICT_ON_DROP} | {[ALTER {{CHECK |
FOREIGN KEY} имя_ограничения определение_ограничения] |
[COLUMN] имя_столбца определение_столбца} {[DROP тип_ограничения имя_ограничения] | ключ_секционирования |
RESTRICT_ON_DROP} | [DATA CAPTURE {NONE | CHANGES [INCLUDE LONGVAR COLUMNS]}
| [ACTIVATE NOT LOGGED INITIALLY [WITH EMPTY TABLE]] | [PCTFREE int] I
[LOCKSIZE {ROW | TABLE}] | [APPEND {ON | OFF}] | [[NOT] VOLATILE [CARDINATITY]] | [[DEACTIVATE VALUE COMPRESSION]} […]
| SET MATERIALIZED QUERY AS {DEFINITION ONLY | подзапрос]
Параметры для этих команд следующие
(имя_столбца тип_данных атрибуты […])
Определение столбца согласно стандарту ANSI. Однако в DB2 поддерживается несколько дополнительных атрибутов, специфичных для специальных типов данных DB2. Поддерживаются все стандартные атрибуты ANSI, например NOT NULL. За подробностями обращайтесь к главе 2, разделу о типах данных.
UNDER супертаблица INHERIT SELECT PRIVELEGES | HIERARCHY имя_иерархии
Сходно с предложением OF стандарта ANSI в команде CREATE TABLE с двумя дополнительными предложениями — INHERIT и HIERARCHY. При указании предложения INHERIT пользователь или группа, имеющие доступ для чтения в супертаблице, также должны иметь доступ для чтения в новой таблице. Предложение HIERARCHY связывает подтаблицу с иерархией таблиц, имя_иерархии — это имя корневой таблицы иерархии. Если предложение опущено, DB2 генерирует имя_иерархии самостоятельно.
определение таблицы
Определяются элементы объектной таблицы, в том числе дополнительные опции столбцов и столбец OID корневой таблицы, а также ограничения таблиц.