Системы обработки информации - язык баз данных SQL

Раздел LIKE оператора CREATE TABLE


Одной из возможностей SQL:1999 являлась возможность определения новой базовой таблицы, подобной (like) одной или нескольким существующим таблицам. В форме, специфицированной в стандарте SQL:1999, она не представляла существенного интереса. Однако, чтобы пояснить суть расширения, введенного в SQL:2003, мы должны сначала обсудить исходный вариант.

Итак, в SQL:1999 в списке элементов определения таблицы оператора CREATE TABLE, помимо определений столбцов и табличных ограничений, могли присутствовать элементы вида LIKE table_name. Наличие одного или нескольких подобных разделов в определении новой таблицы приводило к копированию в ее определении структуры указанных существующих таблиц. Однако при этом копировались только имена столбцов указанных таблиц и типы данных этих столбцов. Другими словами, выполнялась примитивная макроподстановка. Пример определения таблицы с использованием раздела LIKE показан на рис. 2.

CREATE TABLE T1 (
C1 VARCHAR (100) NOT NULL DEFAULT ‘TEST’,
C2 INTEGER );

CREATE TABLE T2 (

LIKE T1,
C3 CHAR (20));

CREATE TABLE T3 (
C1 VARCHAR (100),
C2 INTEGER,
C3 CHAR (20));

Рис. 2. Пример определения таблицы с использованием раздела LIKE в стиле SQL:1999

Как показывает рис. 2, определение таблицы T2, полученное с использованием раздела LIKE, эквивалентно определению таблицы T3. В определении таблицы T2 утрачена некоторая информация, присутствующая в определении T1: в столбце C1 не допускается наличие неопределенных значений, и для него указано значение по умолчанию.

Хотя и вариант раздела LIKE, специфицированный в SQL:1999, может быть полезен на практике при определении похожих таблиц с большим числом столбцов, в SQL:2003 введены некоторые необязательные расширения, позволяющие управляемым образом копировать больше информации о столбцах существующих таблиц. Более точно, в SQL:2003 раздел LIKE имеет следующую синтаксическую форму:

like_clause ::= LIKE table_name [ like_option_list ]

like_option ::= INCLUDING IDENTITY | EXCLUDING IDENTITY
| INCLUDING DEFAULTS | EXCLUDING DEFAULTS
| INCLUDING GENERATED | EXCLUDING GENERATED

Свойства IDENTITY и GENERATED – это новые свойства столбцов, введенные в SQL:2003. Мы обсудим их ниже в этом разделе. Пока же ограничимся примером определения таблицы с использованием раздела LIKE в стиле SQL:2003, в котором копируется информация о значении столбца по умолчанию:

CREATE TABLE T4 (

LIKE T1,
INCLUDING DEFAULTS);

Таблица T4 теперь имеет в точности ту же структуру, что и таблица T1. При отсутствии опций раздел LIKE ведет себя так же, как и в SQL:1999, за тем исключением, что свойство NOT NULL столбца всегда копируется. Заметим также, что выполнение оператора CREATE TABLE с разделом LIKE не приводит к образованию какой-либо зависимости между новой таблицей и той, которая использовалась в разделе LIKE (т.е. их структура может независимо изменяться).



Содержание раздела