Материал: Базы данных и их безопасность. Плотников Д.Г

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Предложение CREATE TABLE

Теперь мы в состоянии подробно обсудить предложение CREATE TABLE. Это предложение имеет следующий общий формат:

CREATE TABLE имя—базовой—таблицы (определение — столбца [, определение—

столбца] ...) [другие—параметры];

Здесь «определение — столбца» в свою очередь имеет формат:

имя—столбца тип—данных [NOT NULL]

Факультативные «другие—параметры» имеют дело главным образом с проблемами физического хранения. Примечание. Прямые скобки в синтаксических определениях используются для того, чтобы указать, что конструкции, заключенные в эти скобки, являются необязательными (т. е. могут быть опущены). Многоточие указывает, что непосредственно предшествующая ему синтаксическая единица факультативно может повторяться один или более раз.

Ниже приведен пример предложения CREATE TABLE для таблицы S, теперь уже в полном виде:

CREATE TABLE S

 

(НОМЕР_ПОСТАВЩИКА

CHAR (5) NOT NULL,

ФАМИЛИЯ

CHAR (20),

СОСТОЯНИЕ

SMALLINT,

ГОРОД

CHAR (15));

Результат этого предложения состоит в том, что создается новая пустая базовая таблица, названная xyz.S, где xyz — имя, под которым известен системе пользователь, издающий предложение CREATE TABLE. В системный каталог при этом помещается статья, описывающая эту таблицу.

226

Пользователь xyz может обращаться к таблице по ее полному имени xyz.S или по сокращенному имени S. Другие пользователи должны обращаться к ней только по ее полному имени. Данная таблица состоит из четырех столбцов с именами xyz.S.НОМЕР_ПОСТАВЩИКА, xyz.S.ФАМИЛИЯ, xуz.S.COCTOЯHИE и xуz.S.ГOPOД, имеющих указанные в определении типы данных. (Типы данных будут рассматриваться ниже). Пользователь xyz может обращаться к этим столбцам по их полным или по сокращенным именам: S.HOMEP_ПОСТАВЩИКА, S.ФAMИЛИЯ, S.СОСТОЯНИЕ и S.ГОРОД. Другие пользователи должны применять только полные имена столбцов. Заметим, однако, что независимо от того, включается ли в имя часть «xyz», часть «S» может быть опущена, если это не приводит к двусмысленности, но ее включение никогда не является ошибкой.

Вообще относительно имен справедливы следующие правила. Имена пользователей, например xyz, являются уникальными во всей системе. Имена таблиц (неуточненные) уникальны для пользователя. Имена столбцов (неуточненные) уникальны для таблицы1. Под «таблицей» здесь понимаются как базовые таблицы, так и представления. Таким образом, представление не может иметь такое же имя, как и базовая таблица.

После того как таблица создана, в нее могут быть введены данные с помощью предложения INSERT (вставить) языка SQL.

Типы данных

В различных системах и реализациях систем, поддерживаемые типы данных и форматы могут отличаться.

1 Кроме того, в качестве имен не могут использоваться зарезервированные и ключевые слова языка SQL. Первая литера любого имени должна быть буквой, а остальные литеры—буквами, цифрами или знаком подчеркивания. Использование # и $ специально оговаривается.

227

Например, система DB2 поддерживает следующие типы: INTEGER — двоичное целое число, занимающее

полное машинное слово, 31 бит со знаком SMALLINT — двоичное целое число, занимающее

полуслово, 15 бит со знаком

DECIMAL (p, q) — упакованное десятичное число, включающее p цифр и знак (0<p<16); предполагается q цифр справа от десятичной точки (q<p; если q=0, она может быть опущена)

FLOAT — число n с плавающей точкой, занимающее двойное слово и представленное шестнадцатеричной мантиссой f с точностью до 15 знаков (— 1<f<+l) и двоичным целочисленным порядком e (—65<e<+64) таким образом, что n=f*(16**e); примерный диапазон значений n — от 5.4Е—79 до 7.2Е+75; см. также ниже пояснения для констант типа FLOAT

CHAR (n) — литерная строка фиксированной длины из n литер (0<n<255)

VARCHAR (n) — литерная строка переменной длины, не превышающей n литер (0<n; максимальное значение n зависит от ряда факторов, но в общем случае должно быть меньше, чем «размер страницы» — 4К либо 32К — пространства, содержащего данную таблицу).

Константы

Набор констант также различен для разных СУБД, например, в DB2 поддерживаются:

целочисленная — записывается как десятичное целое число со знаком или без знака, без десятичной точки; примеры: 4 -95 4 -364 0

десятичная — записывается как десятичное число со

228

 

знаком или без знака, с десятичной

 

точкой; примеры: 4.0 —95.7 +364.05 0.007

с плавающей точкой

—

записывается

как

десятичная

 

константа, за которой следует буква E с

 

последующей целочисленной константой;

 

примеры: 4E3 —95.7Е46 +364Е—5 0.7Е1

 

(примечание:

выражение

xEy

 

представляет значение х*(10**у))

 

строковая

— записывается либо как строка литер,

 

заключенная в одиночные кавычки, либо

 

как строка пар шестнадцатеричных цифр,

 

представляющих

 

рассматриваемые

 

литеры в коде ASCII или EBCDIC, в

 

зависимости

от

 

используемого

 

компьютера

 

 

 

 

Неопределенное значение

Вернемся теперь к основной теме данной главы. Практически все системы поддерживают концепцию

неопределенного значения данных (NULL). Фактически любой столбец может содержать неопределенное значение, если в определении этого столбца в предложении CREATE TABLE явным образом не специфицировано NOT NULL (неопределенное значение не допускается). Неопределенное значение

— это специальное значение, которое используется для того, чтобы представлять «неизвестное значение» или «неприменимое значение». Это не то же самое, что пробел или ноль. Например, запись поставки может содержать неопределенное значение поля КОЛИЧЕСТВО (известно, что поставка имела место, но неизвестен объем поставки). Запись поставщика может также содержать неопределенное значение в столбце СОСТОЯНИЕ (может быть, например, что СОСТОЯНИЕ не соотносится по некоторой причине поставщикам в Сан-Хосе).

Вернемся к предложению CREATE TABLE для базовой таблицы S. Мы специфицировали NOT NULL только для

229

столбца НОМЕР-ПОСТАВЩИКА. Результатом этой спецификации является гарантия того, что запись каждого поставщика в базовой таблице S всегда будет содержать какойлибо реальный (отличный от неопределенного значения) номер поставщика. Напротив, любое из значений ФАМИЛИЯ, СОСТОЯНИЕ и ГОРОД или все они могут быть неопределенными в той же самой записи.

Предложение ALTER TABLE

Точно так же, как в любое время можно с помощью предложения CREATE TABLE создать новую базовую таблицу, можно также в любое время изменить существующую базовую таблицу, добавляя к ней справа новый столбец. Для этого используется предложение ALTER TABLE:

ALTER TABLE имя—базовой—таблицы

ADD имя—столбца тип—данных;

Например,

ALTER TABLE S ADD СКИДКА SMALLINT;

Это предложение добавляет к таблице S столбец СКИДКА. Все существующие записи таблицы S расширяются с четырех значений полей данных до пяти, и во всех случаях новое пятое поле принимает неопределенное значение. Спецификация NOT NULL в предложении ALTER TABLE не допускается. Заметим, между прочим, что только что описанное расширение существующих записей, не означает, что в это время физически обновляются записи в базе данных. Изменяется лишь хранимое в каталоге описание таблицы. Отдельные записи физически не изменяются до тех пор, пока они в следующий раз не станут целевыми для предложения

UPDATE языка SQL.

230

Источник: https://studfile.net/preview/16563653/