2008 г.
Базы данных. Вводный курс
Сергей Кузнецов
Назад Содержание Вперёд
16.2. Средства определения, изменения и ликвидации базовых таблиц
Базовые (реально хранимые в базе данных) таблицы создаются (определяются) с использованием оператора CREATE TABLE
. Для изменения определения базовой таблицы применяется оператор ALTER TABLE
. Уничтожить хранимую таблицу (отменить ее определение) можно с помощью оператора DROP TABLE
.
Замечание: хотя внешне операторы CREATE TABLE
, ALTER TABLE
и DROP TABLE
похожи на соответствующие операторы определения, изменения определения и отмены определения домена, между ними имеется принципиальное различие. Определение домена приводит всего лишь к созданию некоторых новых описателей, входящих в состав метаданных базы данных. Создание базовой таблицы, кроме создания соответствующих описателей, порождает новую область внешней памяти, в которой будут храниться данные, поставляемые пользователями. Тем самым, базовая таблица SQL-ориентированной базы данных является прямым аналогом переменной отношения реляционной модели данных.
16.2.1. Определение базовой таблицы
Оператор создания базовой таблицы CREATE TABLE
имеет следующий синтаксис:
base_table_definition ::= CREATE TABLE base_table_name (base_table_element_commalist)
95)
base_table_element ::= column_definition | base_table_constraint_definition
Здесь base_table_name
задает имя новой (изначально пустой) базовой таблицы. Каждый элемент определения базовой таблицы является либо определением столбца, либо определением табличного ограничения целостности.
Определение столбца
Элемент определения столбца специфицируется на основе следующих синтаксических правил:
column_definition ::= column_name
{ data_type | domain_name }
[ default_definition ]
[ column_constraint_definition_list ]
В элементе определения столбца column_name
задает имя определяемого столбца. Тип столбца специфицируется путем явного указания типа данных (data_type
) или путем указания имени ранее определенного домена (domain_name
).
Значения столбца по умолчанию
Необязательный раздел определения значения столбца по умолчанию имеет тот же синтаксис, что и раздел определения значения по умолчанию в операторах определения или изменения определения домена:
DEFAULT { literal | niladic_function | NULL }
Действующее значение по умолчанию для данного столбца определяется следующим образом:
- если в определении столбца явно присутствует раздел
DEFAULT
, то значением столбца по умолчанию является значение, указанное в этом разделе; - иначе, если столбец определяется на домене и в определении этого домена явно присутствует раздел
DEFAULT
, то значением столбца по умолчанию является значение, указанное в этом разделе; - иначе значением по умолчанию столбца является
NULL
.96)
Заметим, что если значением по умолчанию неявно объявлено неопределенное значение (NULL
), но среди ограничений целостности столбца присутствует ограничение NOT NULL
(см. ниже), то считается, что у столбца вообще отсутствует значение по умолчанию. Это означает, что при любой вставке новой строки в соответствующую базовую таблицу значение данного столбца должно быть задано явно.
Ограничения целостности столбца
Элемент необязательного списка ограничений целостности столбца определяется следующими синтаксическими правилами:
column_constraint_definition ::=
[ CONSTRAINT constraint_name ]
NOT NULL
| { PRIMARY KEY | UNIQUE }
| references_definition
| CHECK ( conditional_expression )
Как мы увидим немного позже, любое ограничение целостности, включаемое в определение столбца, может быть эквивалентным образом выражено в виде табличного ограничения целостности. Единственный резон определения ограничений на уровне столбца состоит в том, что в этом случае в ограничении целостности не требуется явно указывать имя столбца. Тем не менее, кратко рассмотрим ограничения целостности столбца отдельно.
Ограничение NOT NULL
означает, что в определяемом столбце никогда не должны содержаться неопределенные значения. Если определяемый столбец имеет имя C
, то это ограничение эквивалентно следующему табличному ограничению: CHECK (C IS NOT NULL)
.
В определение столбца может входить одно из ограничений уникальности: ограничение первичного ключа (PRIMARY KEY
) или ограничение возможного ключа (UNIQUE
). Включение в определение столбца любого из этих ограничений означает требование уникальности значений определяемого столбца (т. е. во все время существования определяемой таблицы во всех ее строках значения данного столбца должны быть различны97)). Ограничение PRIMARY KEY
, в дополнение к этому, влечет за собой ограничение NOT NULL
для определяемого столбца. Эти ограничения столбца эквивалентны следующим табличным ограничениям: PRIMARY KEY (C)
и UNIQUE (С)
.
Ограничение references_definition
означает объявление определяемого столбца внешним ключом таблицы и обладает следующим синтаксисом:
references_definition ::=
REFERENCES base_table_name [ (column_commalist) ]
[ MATCH { SIMPLE | FULL | PARTIAL } ]
[ ON DELETE referential_action ]
[ ON UPDATE referential_action ]
На самом деле, данная синтаксическая конструкция работает и в случае определения внешнего ключа на уровне таблицы (в одном из определений табличных ограничений целостности). Поэтому мы отложим обсуждение до рассмотрения этого общего случая. Пока отметим только, что при использовании конструкции на уровне определения столбца column_commalist
может содержать имя только одного столбца (потому что внешний ключ состоит из одного определяемого столбца). Ограничение эквивалентно следующему табличному ограничению: FOREIGN KEY (C) references_definition
.
Проверочное ограничение CHECK (conditional_expression)
приводит к тому, что в данном столбце могут находиться только те значения, для которых вычисление conditional_expression
не приводит к результату false
. В условном выражении проверочного ограничения столбца разрешается использовать имя только определяемого столбца. Заметим, что проверочное ограничение столбца может быть безо всяких изменений перенесено на уровень определения табличных ограничений.
95 В круглых скобках указывается список определений элементов базовой таблицы (должно присутствовать определение хотя бы одного столбца), разделенных запятыми.
96 Заметим, что хотя столбец может получить значение NULL
по умолчанию как явным, так и неявным образом, эти два случая не являются эквивалентными. Явное задание NULL
в качестве значения по умолчанию запрещает наследование столбцом значения по умолчанию домена.
97 В этом случае SQL опирается на семантику неопределенных значений, отличную от используемой в большинстве других случаев. Считается, что (NULL = NULL) = true
и что (a = NULL) = (NULL = a) = false
для любого значения a
, отличного от NULL
.
Назад Содержание Вперёд