Перед тем как перейти к созданию таблиц, необходимо выполнить проектирование базы данных и нормализацию таблиц.

Далее следует определить, какие таблицы и с какими столбцами (полями) подлежат созданию.

Создать, если это не было сделано ранее, саму базу и выполнить команду соединения с базой (см. CREATE DATABASE ... и CONNECT <database> USER <username> PASSWORD <password>).

Создать комплект необходимых доменов и только после этого можно перейти к физическому вводу описаний таблиц.

Создание таблицы, точнее, ее описания и "пустографки" осуществляется командой CREATE TABLE.

При создании таблицы мы должны задать, как минимум, ее имя и перечень полей с их атрибутами и контрольными ограничениями. Кроме того, при создании таблицы можно задать ее первичный ключ, внешние ключи, задающие требования по поддержанию логической целостности дополнительные виды контроля на уровне записей.

Создание таблиц. Команда CREATE TABLE

Команда CREATE TABLE имеет следующий синтаксис:

CREATE TABLE table [EXTERNAL fFILEJ " <filespec>"] (I/XST_<col_def> [, LJST_<tconstraint>J ) ;

table - имя создаваемой таблицы. Имя таблицы внутри базы должно быть уникальным,

EXTERNAL [FILE] "<filespec>" задает таблицу, данные которой размещаются во внешней (не InterBase) таблице или файле,

<col_def> - описание поля (атрибута в терминах отношений) таблицы, <tconstraint> - описание ограничений логической целостности для таблицы в целом.

Описание полей таблицы Для описания полей <col_def> используется следующий синтаксис:

<col_def>::= col {datatype | COMPUTED [BY] (< expr>) / domain}

[DEFAULT {liter\ NOLL \ USER}]

[NOT NOLL] [<col_constraint>]

[COLLATE collation]

Первая строка относится к обязательным атрибутам описания столбца (поля):

col - имя столбца; должно быть уникальным в пределах таблицы; { datatype \ COMPUTED [BY] (< expr>) \ domain) задают тип данных в столбце, где datatype - любой допустимый в InterBase тип данных, а именно:

{SMALLINT I INTEGER \ FLOAT | DOUBLE PRECISION) [ <ar~

ray-dim>]

i {DECIMAL | NUMERIC] [(precision [, scale])] [ <array__dim>]

I {DATE I TIME I TIMESTAMP) [<array_dim>]

' {CHAR | CHARACTER \ CHARACTER VARYING \ VARCHAR}

'[( int)] [<array_dim>] [CHARACTER SET charname]

I {NCHAR | NATIONAL CHARACTER \ NATIONAL CHAR)

'[VAR YINGJ [(in 1)][<array_dim >]

| BLOB [ SUB_TYPE {int \ subtype_name) ][SEGMENT SIZE int]

[CHARACTER SET charname]

| BLOB [( seglen [, subtype])]

}

<array_dim> ::= fLIST_<dims>]

<dims> :: = x[ ;y]

ТИПЫ данных TIME и TIMESTAMP допустимы в версиях, начиная с 6.0.

domain - имя определенного ранее домена (описание домена, в свою очередь, содержит описание типа данных);

COMPUTED [BY] (< expr>) - выражение для вычисляемого столбца. Значения вычисляемых столбцов рассчитываются в соответствии с задаваемым выражением всякий раз при обращении к ним. Выражение может быть любым допустимым в InterBase выражением, возвращающим единственное значение простого типа (не массив). Например, допустимы выражения с конструкцией SELECT. Используя нашу базу, можно добавить в таблицу TBOOKAUTHOR два поля В1 и В2, которые будут использоваться для выбора автора и названия книги. Для добавления полей используется команда ALTER TABLE, синтаксис которой будет рассмотрен ниже.

Пример 4.10

alt е г TABLE TBOOK_AUTHOR add

В1 varchar(60) COMPUTED BY ((select a.auname from tauthora where a. author=tbook__author.author));

alter TABLE TBOOK_AUTHOR add

B2 COMPUTED BY ((select a.booknm from tbook а where a. unikey=tbook_author.bookkey));

Тогда результат работы

select * from tbookauthor;

Можно представить в виде таблицы.

Таблица 4.1. Перечень книг с указанием авторов и названий (вычисляемые поля)

Unikey Author Bookkey В1 В2
58 25 6 Культин Н.Б. Макрокоманды MS Word
59 33 12 Буассо Марк Введение в технологию ATM
60 34 12 Деманж Мишель Введение в технологию ATM
61 35 12 Мюнье Жан-Мари Введение в технологию ATM
62 32 11 Луис Дерк С и C++ Справочник
63 31 10 Дунаев Сергей Borland-Технлогии. SQL-Link InterBase, Paradox for Windows, Delphi
64 29 9 Елманова Н.З. Введение в C++ Builder
65 30 9 Кошель СП. Введение в C++ Builder
66 28 8 Подбельский Вадим Валериевич ЯзыкC++
67 26 7 Хаселир Райнер Г. Word 6 for Windows
68 27 7 Фаненштих Клаус Word 6 for Windows
69 21 16 Ладыжинская Ольга Александровна Математические вопросы динамики вязкой несжимаемой жидкости
70 24 15 без авторов Тесты. Сборник 11 класс. Варианты и ответы государственного тестирования. Пособие для подготовки к тестированию
71 23 14 Розенталь Д.Э. Справочник по правописанию и литературной правке
72 22 13 Бурова И.И. The history of England. Absolute Monarchy

Unikey

73

Author Bookkey В1 В2
19 17 Дашкова Полина Кровь нерожденных
74 20 18 Хмелевская Иоанна Тайна

Вторая строка в синтаксисе описания полей (DEFAULT {literal | NULL | USER}) задает значение поля при создании новой строки таблицы.

При добавлении в таблицу новых строк не требуется, вообще говоря, задание значений всех ее столбцов. В то же время каждое поле в таблице должно иметь хоть какое-то допустимое значение. Для того чтобы задать значение столбца в этом случае, и служит конструкция DEFAULT. Если она отсутствует, то это эквивалентно конструкции DEFAULT NULL.

Если тип поля задан с помощью Домена, в котором присутствует конструкции DEFAULT, а в описании поля таблицы DEFAULT отсутствует, то в качестве значения по умолчанию принимается значение, заданное в описании домена. Если конструкция DEFAULT в описании поля таблицы указана явно, то значение по умолчанию будет взято из нее вне зависимости от указанного в описании домена (значение переопределяет заданное в домене).

literal задает значение поля явно и по типу должно соответствовать объявленному полю. В качестве допустимого значения для полей типа DATE может быть сегодняшняя дата, задаваемая конструкцией NOW. NULL задает значение NULL Поскольку оно предполагается изначально, то задавать его стоит только при необходимости переопределить значение, указанное в домене. Последнее возможно, если в домене не указана конструкция NOT NULL, которую уже нельзя отменить. USER указывает, что в поле будет занесено символьное имя USER'a, создавшего запись. Длина этого поля должна соответствовать требованиям к длине для имен пользователей (обычно от 8 до 16 символов) и использовать ту же или совместимую кодовую таблицу (character set).

Пример 4.11

CREATE DOMAIN USERNAME AS VARCHAR(20)

CREATE TABLE ABC (

ABC DATE DATE DEFAULT "NOW",

ABC USER USERNAME DEFAUIT USER,

ABC_COUNT DOUBLE PRECISSION DEFAULT 1 );

NOT NULL из третьей строки указывает, что поле не может содержать значение NULL (ни при создании, ни при обновлении данных). Отметим, что явно задаваемое значение NULL не должно конфликтовать с конструкцией NOT NULL, как в COUNT INTEGER DEFAULT NULL NOT NULL.

<col_constraint> из этой же строки описывает ограничения логической целостности для столбца.

InterBase позволяет задавать ограничения на отдельные столбцы или таблицу в целом, называемые ограничениями логической целостности, которые задают порядок управления зависимостями между столбцом и таблицей или таблицей и таблицей. Они воздействуют на все выполняемые с таблицей действия, автоматически поддерживаясь системой. В зависимости от типа ограничения они применяются либо к таблице целиком, либо к отдельным ее столбцам.

Конструкция <col_constraint> относится к отдельному столбцу и имеет следующий синтаксис:

<col_constraint> ::= /"CONSTRAINT constraint./ fUNIQUE / PRIMARY KEY

/ CHECK (<search_condition>)

/ REEERENQlS other table [ {LIST_other_col) ]

[ON DELETE {NO ACTION/CASCADE/SET DEFAULT/SET NULL}]

[ON UPDATE {NO ACTION/CASCADE/SET DEFAULT/SET NULL}]

)

Ограничения на первичный (PRIMARY KEY) или уникальный (UNIQUE) ключ означают, что значение в соответствующем столбце является уникальным, то есть в таблице не может быть двух строк с одинаковыми значениями в данном столбце. Соответственно значения в таком столбце не могут принимать значение NULL. При попытке записать значение, которое уже встречается в таблице, InterBase выдает сообщение об ошибке.

Отметим, что и первичные, и уникальные ключи могут строиться не только по отдельному полю, но и по группе полей (см. описание ограничений логической целостности для таблицы в целом).

В таблице может быть только один первичный ключ. Уникальных ключей может быть несколько, с точки зрения теории отношений все они являются синонимами первичного ключа. В то же время трудно представить себе ситуацию, когда может понадобиться иметь более одного уникального ключа, отличного от первичного.

Другие элементы конструкции <col_constraint> означают:

• CHECK (<search_condition>) задает условие, которому должно соответствовать значение определяемого столбца. Синтаксис конструкции CHECK следующий (см. также <search_condition> в команде SELECT):

CHECK (<search condition»);

<search_condition> ;;= f<val> <operator> i{<val> / (<select_one>)y j <val> [NCR] BllW1 1 N <val> AND <val>

/ <val> [HOT] LIKE <val> /"ESCAPE <val>]

/ <val> [NOT 7 IN (LIST_<val> / <select list>)

/ <val> IS [NOT] NULL

/ <val> {[NOT] {= I < I >} I >= / <=}

(ALL / SCME / ANY; (<select list>) j EXISTS ( < select expr>) j SINGULAR (<select expr>)

/ <val> [NOT] CONTAINING <val>

/ <val> [NOT] STARTING [WITH] <val>

/ (<search_condition>)

/ NOT <search_condition>

/ <search_condition> OR <search_condition>

/ <search_condition> AND <search_c0nditi0n>j

Конструкция CHECK относится только к одной строке таблицы. Для столбца может быть задана только одна конструкция CHECK.

Если описание столбца базируется на домене, то введенная конструкция CHECK не отменяет заданную в домене, а добавляет собственный контроль к заданному в домене.

Отметим, что в конструкции <search_condition> можно использовать любые данные текущей строки таблицы, а также результаты поиска по базе, что делает конструкцию CHECK значительно более мощной, чем ее аналог в описании домена.

• REFERENCES oilier table /'(L/ST_other_col)/

/ON DELETE /NO ACTION CASCADE SET DEFAULT|SET Nin.iJJ /ON UPDATE /NO ACTION CASCADE SET DEFAULT|SET NULL/7

задает ограничение внешнего ключа для описываемого столбца.

Ограничение означает, что данное поле соответствует первичному ключу [ (LIST_other_col) ]в таблице other_table и в этой таблице имеется строка с указанным значением. Если список опущен, то предполагается список из одного поля, имеющего то же имя, что и описываемое.

Дополнительные режимы ON DELETE и ON UPDATE задают действия, производимые при удалении или обновлении ключевых полей в родительской (здесь other_1аЫе)таблице.

Возможны следующие варианты:

NO ACTION - нетдействий (принимается по умолчанию).

CASCADE - каскадное удаление (замена) влечет удаление (замену) во всех строках дочерней таблицы при удалении, замене соответствующих им строк родительской таблицы.

SET DEFAULT -при удалении (замене) строк родительской таблицы, соответствующие им поля в дочерней переустанавливаются в значения по умолчанию.

SET NULL - при удалении (замене) строк родительской таблицы, соответствующие им поля в дочерней переустанавливаются в NULL.

Наконец четвертая строка синтаксиса описания полей (COLLATE collation) задает порядок сравнения символьных данных (для алфавитного упорядочения).

Нам осталось рассмотреть последний элемент синтаксиса команды CREATE TABLE, а именно <tconstraint> - описание ограничений логической целостности для таблицы в целом (см. также описание ограничений логической целостности <col_constraint> для столбца).

Приведем синтаксис конструкции <tconstraint>.

<tconstraint> : .- = /"CONSTRAINT constraint./

{ fPRIMARY KEY I UNIQUE. ? (LIST_col)

I FOREIGN KEY {LIST_col) REFERENCES Other_table

[ON DELETE {NO ACTION / CASCADE / SET DEFAULT / SET NULL} ]

f ON UPDATE {NO ACTION / CASCADE / SET DEFAULT / SET NULL} ]

/ CHECK ( <search_condition>)} ,

Ограничение //PRIMARY KEY | UNIQUE/ (L/ST_col) на первичный (PRIMARY KEY) или уникальный (UNIQUE) ключ означают, что значение в указанном столбце или группе столбцов является уникальным, то есть в таблице не может быть двух строк с одинаковыми значениями в данном столбце или группе столбцов. Соответственно значения в таких столбцах не могут принимать значение NULL. При попытке записать значение, которое уже встречается в таблице, InterBase выдает сообщение об ошибке.

Ограничения FOREIGN KEY (LIST_col) REFERENCES other table /ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL/7 на внешний (FOREIGN KEY) ключ означают, что значение в указанном столбце или списке столбцов [(LIST_co\)] соответствует первичному ключу в таблице other_table и в этой таблице имеется строка с указанным значением. Соответственно значения в таких столбцах не могут принимать значение NULL.

Дополнительные режимы ON DELETE и ON UPDATE задают действия, производимые при удалении или обновлении ключевых полей в родительской (здесь о?йег_йЬ/е)габлице.

Возможны следующие варианты:

NO ACTION- нет действий (принимается по умолчанию).

CASCADE - каскадное удаление (замена) влечет удаление (замену) в0 всех строках дочерней таблицы при удалении, замене соответствующих им строк родительской таблицы.

SET DEFAULT - при удалении (замене) строк родительской таблицы соответствующие им поля в дочерней таблице переустанавливаются в значение по умолчанию.

SET NULL - при удалении (замене) строк родительской таблицы соответствующие им поля в дочерней таблице переустанавливаются в NULL.

CHECK (<search_condition>) задают условия, проверяемые по значениям группы столбцов. Синтаксис конструкции <search_condition> аналогичен соответствующей конструкции команды SELECT.

Замечание. Конструкция FOREIGN KEY (LAST_col) REFERENCES other_table ... для таблицы, как и конструкция REFERENCES other_table [(LIST_о1:Ьег_со1)/для отдельного столбца порождают внешний ключ, но при задании списка столбцов в первом случае перечисляются столбцы описываемой таблицы, а во втором той таблицы, на которую осуществляется ссылка.

Использование внешних файлов Конструкция использования внешних файлов EXTERNAL FILE имеет вид

EXTERNAL [FILE] " <filespec> "

С помощью этой конструкции создается описание таблицы. Сами данные размещаются во внешнем файле (таблице), отличном от интер-бейсовской базы. Внешние файлы представляют собой тексты, которые могут обрабатываться неинтербейсовскими приложениями. Согласно синтаксису для команды CREATE TABLE, спецификация файла, следующая за словом EXTERNAL, представляет полностью специфицированное имя файла (включая путь). Файл может модифицироваться вне InterBase, так как доступ к нему осуществляется только по мере необходимости.

Конструкция EXTERNAL FILE используется для:

• Импорта данных из внешнего файла жесткого формата (с записями фиксированной длины) в новую или существующую таблицу InterBase. Это позволяет обновлять таблицы InterBase данными из внешних источников. Многие приложения позволяют создавать подобные внешние файлы с записями фиксированной длины.

• Выборки данных с помощью SELECT из внешних файлов так же, как если бы они были стандартными таблицами InterBase.

• Экспорта данных из существующих таблиц InterBase во внешний файл. Для форматирования данных из внутренних таблиц InterBase во внешний файл с записями фиксированной длины для использования другими приложениями.

На использование внешних файлов накладываются следующие ограничения:

• Прежде чем получить доступ к внешним файлам из базы данных, они должны быть созданы.

• Все записи во внешнем файле должны быть одной длины. Во внешнем файле нельзя использовать такие типы данных, как массив или BLOB.

• Когда создается таблица, которая будет использоваться для импорта внешних данных, в ней должно быть определено поле для хранения символов конца строки (типа перевод каретки, возврат строки). Размер поля должен быть достаточен для хранения таких символов (обычно один или два байта). В большинстве версий Unix - 1 байт. Для Windows, NT и NetWare - 2 байта.

• Несмотря на то, что допустимо чтение числовых данных прямо из внешней таблицы, значительно проще читать их как символьные данные и преобразовывать с помощью функции CAST.

• Данные, трактуемые как VARCHAR в InterBase, должны храниться во внешнем файле в следующем формате: <2-byte unsigned shortxstring of character bytes>, где 2-byte unsigned short содержит длину в байтах строки, непосредственно следующей за ней. Поскольку таким образом нельзя обеспечить должной совместимости, использование данных типа VARCHAR во внешних файлах не рекомендуется.

При работе с внешними таблицами разрешены только команды INSERT для добавления в них данных и SELECT для выборки. Команды UPDATE и DELETE использовать нельзя. При попытке их применения InterBase выдаст сообщение об ошибке.

Вставка данных во внешние таблицы и выборка из них не используют стандартного механизма транзакций, поскольку они находятся вне базы данных, поэтому изменения выполняются сразу и механизм отката для них невозможен. Для использования механизма управления транзакциями необходимо создать внутреннюю InterBase таблицу и перенести в нее данные из внешней таблицы.

Если удаляется база (DROP DATABASE) необходимо также удалить и внешние файлы, автоматически они удаляться не будут.

Импортвнешнихфайловв таблицы InterBase

: Прежде чем начать работу с внешним файлом, необходимо создать его описание, используя команду CREATE TABLE <file> EXTERNAL FILE "<extem_file_name>". Поля во внешнем файле следует описать как символьные строки фиксированной длины (CHAR). Последнее поле должно быть зарезервировано для символов конца строки (для Unix - 1 байт, для Windows - 2 байта). Сам файл должен быть расположен на сервере. Рассмотрим пример создания внешней таблицы.

В Excel создана таблица с тремя столбцами, содержащими соответственно фамилию, год рождения и табельный номер. Таблица Excel сохранена как форматированный текст (с пробелами в качестве разделителей) List.prn.

Замечание. Чтобы не создавать себе лишних проблем, сначала следует создать такой внешний файл, выяснить его формат и только потом создавать соответствующее описание в InterBase. В противном случае придется либо менять формат созданного файла, что может быть очень неудобно для внешних приложений, либо переописывать соответствующую внешнюю таблицу InterBase.

Создано описание внешней таблицы E_LIST в InterBase.

Пример 4.12

create table E_LIST EXTERNAL "d.- \LINK\LISPRN" (

FAMILIA CHAR (12) NOT NULL,

GOD_ROG CHAR (4),

TAB_NOM CHAR(8),

RAZFDEL CHAR(2)

);

Теперь запрос select Familia, god_rog, Tab_nom from E LIST;

дает следующий результат:

Таблица 4.2. Список во внешнем файле, экспортированном из Excel

FAMILIA GODJROG TAB_NOM
Сидоров 1916 1
Иванов 1989 1003
Петров 1958 2087
Мухин 1975 1312

Если данные из внешней таблицы предполагается каким-либо образом обрабатывать, особенно, если обработка предполагает внесение изменений, то ее хранение в такой форме, безусловно, неудобно. В этом случае целесообразно создать ее аналог в формате InterBase, для которой можно ввести необходимые индексы, триггеры и другие средства эффективной обработки. Столбец - аналог столбцу RAZFDEL - целесообразно сохранить, если в дальнейшем предполагается производить выгрузку во внешнюю таблицу, иначе он, вообще говоря, не нужен. Я бы рекомендовал сохранять его в любом случае. Никогда заранее* не знаешь, что будет в дальнейшем, а затраты на его хранение невелики.

Продолжим наш пример. Для этого создадим обычную таблицу InterBase.

Пример 4.13

create table I_LIST(

FAMILIA CHAR (12) NOT NULL,

GOD_ROG integer, ,

TAB_NOM integer, '

RAZFDEL CHAR (2), primary key ( FAMILIA )

):

Теперь заполним ее данными из внешней таблицы.

insert into ILIST (FAMILIA, GOD_ROG, TAB_NOM, RAZFDEL) select FAMLLLA, CAST(GOD_ROG as integer),

CAST(TAB_NOM as integer),

RAZFDEL from e_list;

Затем проведем необходимую обработку и, наконец, снова выгрузим данные во внешний файл. Предварительно его следует очистить (например, текстовым редактором), иначе новые данные просто припишутся к старым, а это вряд ли то, что хотелось бы получить.

insert into E LIST (FAMILIA, GOD_ROG, TAB_NOM, RAZFDEL) select FAMILIA, CAST (GOD_ROG as CHAR(4)),

CAST(TAB_NOM as CHAR(8I),

RAZFDEL from i_list;

Следует отметить, что из-за преобразований внешний вид текста во внешнем файле может измениться. Прежде всего, это касается выравнивания текста и положения десятичной точки.

Замечание 1. При вводе данных из внешней таблицы следует обратить внимание на синтаксическую правильность ее заполнения. Это касается прежде всего:

• контроля длины всех строк и отдельных полей;

• правильности заполнения разделителей строк;

• если таблица содержит уникальные ключи, то контроль этого должен быть обязательно проведен во внешнем приложении, иначе оператор Insert выдаст сообщение об ошибке.

Замечание 2. При разработке приложений в среде специализированных средств программирования, таких как C++Builder или Delphi, проблемы с внешними таблицами обычно вообще не возникают. В этом случае для выборки данных из внешних файлов можно написать запрос средствами локального SQL, а затем, используя компоненту типа BatchMove, перенести данные в таблицу InterBase или наоборот. Так что, если вы работаете с системами программирования подобного типа, то внешние таблицы вам, скорее всего, никогда не понадобятся и вы просто зря потеряли время на прочтение последней страницы, хотя, как знать, может быть, все-таки пригодится.

4.2. домены | Введение в InterBase | Модификация таблиц. команда alter table


Введение в InterBase



Новости за месяц

  • Июнь
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс