Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. - Базы данных. Учебник для высших учебных заведений (6-е изд.) - 2009

.pdf
Скачиваний:
4972
Добавлен:
14.05.2016
Размер:
14.64 Mб
Скачать

12. СУБД Visual FoxPro 8.0

4 5 3

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

1.Откроем окно Конструктора таблиц для таблицы T ZAGR. Для этого в окне Конструктора БД установим курсор на таблицу, щелчком правой кнопкой мыши вызовем всплывающее меню и выполним команду Modify (модифицировать).

2.В диалоговом окне Конструктора таблиц выберем вкладку Indexes (индексы).

3.В поле Name (имя) открывшегося диалогового окна введем имя индекса i_zagr.

4.В списке возможных типов индекса в поле Туре (тип) выберем Primary.

5.В поле Expression (выражение) введем выражение для индекса izagr.

6.Установим переключатель Order (порядок) в положение по возрастанию (рис. 12.3).

7.Нажмем ОК.

Аналогично можно проиндексировать остальные таблицы БД Bdu (табл. 12.5).

Таблица 12.5

Индексные выражения для индексов БД Bdu

Т а б л и ца

И м я тега

Индексное выражение

T _ Z A G R

i_zagr

Fio+ P r e d m + S T R ( G r u p p a )

T _ P R E P

i_prep

Fio

T _ S T A G

i_stag

S t a g

T _ D O L G N

i_dolgn

D o l g n

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

Изменение структуры таблицы

При работе над проектом порой требуется изменять структуру некоторой таблицы. В структуру таблицы можно вносить следующие изменения:

изменять имена и типы полей,

вставлять пропущенные поля,

удалять лишние поля,

изменять порядок следования полей в таблице.

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

переименовании существующих индексных полей, так как это требует перезаписи индексных файлов таблицы;

454

Часть 3. Современные СУБД и их применение

изменении длины нолей или числа знаков после запятой, так как это может привести к потере данных;

изменении типа поля, гак как в случае невозможности автоматического преобразования данных они будут потеряны.

Замечание.

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

Для изменения структуры таблицы, являющейся элементом БД, нужно открыть диалоговое окно Конструктор таблиц (Table Designer) со структурой выбранной таблицы. Для этого достаточно открыть окно Конструктора БД, установить в нем курсор на модифицируемую таблицу и нажать кнопку

Modify Table (модифицировать таблицу) панели инструментов Database

Designer (конструктор базы данных).

Рассмотрим подробнее операции по модификации таблицы, выполняемые в окне Конструктор таблиц (Table Designer).

Добавление полей является самой безопасной операцией. Для ее реализации необходимо с помощью клавиш-стрелок установить курсор на строку, перед которой необходимо вставить новое поле (в любом ее столбце) и нажат!) кнопку Insert (вставить) (рис. 12.4). При этом появляется новая строка с именем NewField. Далее по рассмотренной технологии можно ввести имя нового поля и его параметры.

Для удаления лишнего поля достаточно выделить его в окне Конструктора таблиц и нажать клавишу Delete (удалить). Если открытый на данный момент индексный файл не содержит ссылок на удаляемое поле, то поле будет удалено. Если такие ссылки имеются, то появится предупреждающее сообщение.

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

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

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

12. СУБД Visual FoxPro 8.0

455

части чисел, у которых она не помещается в отведенные размеры (в поле записывается символ звездочка). Сокращение количества знаков в дробной части понижает точность представления числа.

Возможны проблемы и при изменении типов полей. Например, преобразование числового поля в символьное возможно всегда при условии достаточного выделения места для образующихся символьных строк. Это преобразование осуществляется с помощью функции STR( ). Обратное преобразование выполняется функцией VAL( ) и возможно только в тех случаях, когда строка начинается с цифр или пробелов. В противном случае полученное в результате преобразований числовое поле будет иметь нулевое значение.

Без проблем осуществляется преобразование даты в строку (функция DTOC( ) ) и обратное преобразование (функция CTOD( ) ), при условии что символьная строка содержит допустимые символы.

1 2 . 8 . О р г а н и з а ц и я м е ж т а б л и ч н ы х с в я з е й

В Visual FoxPro можно связывать таблицы — устанавливать связи между ними. При этом возможно установление постоянных и временных связей между таблицами. Постоянные связи можно установить в Конструкторе БД, и они прежде всего необходимы для поддержания целостности БД при обновлении содержимого таблиц. Временные связи между таблицами могут устанавливаться при создании экранных форм (для ввода и редактирования данных) и отчетов. Обычно это делается в случаях, когда имеющиеся постоянные связи по каким-либо причинам не подходят для создаваемой формы или отчета.

Постоянные связи хранятся в словаре БД и автоматически устанавливаются при открытии таблиц. Приведем условия установления постоянных связей.

1.Одна из связываемых таблиц является родительской, другая — дочерней.

2.Для родительской таблицы индекс должен быть определен как первичный ключ (Primary) или ключ кандидат (Candidate).

3.Для дочерней таблицы индекс может быть не уникальным. По этому индексу дочерняя таблица будет связываться с родительской (внешний ключ).

Создадим постоянные связи между таблицами. Для этого войдем в Конструктор БД и убедимся в наличии (или создадим) перечисленные ниже индексы (табл. 12.6).

4 5 6 Часть 3. Современные СУБД и их применение

 

 

Типы индексов БД Bdu

Таблица12.6

 

 

 

Таблица

И м я

тега

Т и п индекса

Индексное выражение

T Z A G R

i_zagr

 

Primary

F i o + P r e d m + S T R ( G r u p p a )

T P R E P

i_fio

 

Primary

Fio

T P R E P

i_dolgn

 

C a n d i d a t e

D o l g n

T P R E P

i_stag

 

C a n d i d a t e

S t a g

T S T A G

i_stag

 

Primary

S t a g

T _ D O L G N

i_dolgn

 

Primary

dolgn

После создания всех необходимых индексов в окне Конструктора БД (рис. 12.4) будут представлены все таблицы в виде списка из полей и индексов, разделенных ключевым словом Indexes (индексы). Если в таблице список полей и индексов виден не полностью, его можно прокрутить вниз или вверх. На рис. 12.5 показаны установленные межтабличные связи.

D a t a b a s e D e s i g n e r

 

 

H ® 13

Ш Fields:

Ш Fields:

 

J

stag

fio

 

 

d_stag

stag

^ F i e l d s :

 

CDlndexes:

dolgn

fio

 

 

kaf

predm

 

 

dllndexes:

gruppa

 

 

i_slag

vidzan

 

 

i_dolgn

CBlndexes:

 

 

? i fio

i_zagr

tJ

 

 

 

Рис. 12.5. Межтабличные связи БД Bdu

12. СУБД Visual FoxPro 8.0

457

Для установления постоянной связи между родительской и дочерней таблицей необходимо:

установить указатель мыши на первичный ключ родительской таблицы;

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

отпустить кнопку.

На экране появится диалоговое окно Edit Relationship (правка связей), содержащее имена связываемых таблиц с раскрывающимися списками индексов. В списках уже выбраны индексы, по которым должна осуществляться связь. Здесь же указывается тип связи между таблицами «один к одному» или «один ко многим». Для сохранения связи нажмем ОК, а при отказе — Cancel (отмена).

Для удаления межтабличной связи требуется выполнить следующее:

навести указатель мыши на линию связи таблиц;

нажать правую кнопку мыши, что приведет к утолщению линии и появлению всплывающего меню;

выполнить команду Remove Relationship (удалить связь) всплывающего меню.

Врезультате выделенная связь будет удалена. Напомним, что установленные постоянные связи между таблицами используются прежде всего для обеспечения ссылочной целостности (непротиворечивости) БД при обновлении

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

1 2 . 9 . О б е с п е ч е н и е с с ы л о ч н о й ц е л о с т н о с т и

Обеспечение ссылочной целостности означает определение допустимых операций над связанными между собой таблицами. Главное требование ссылочной целостности заключается в том, чтобы записи дочерних таблиц имели ссылки на записи в родительской таблице (дети должны иметь родителей). В родительской таблице могут быть записи, не имеющие связанных с ними записей в дочерних таблицах (может быть семья без детей). В Visual FoxPro поддержка ссылочной целостности выполняется с помощью одноименного Построителя. Чтобы открыть Построитель ссылочной целостности, достаточно выполнить следующее:

открыть БД с таблицами, для которых необходимо установить ссылочную целостность;

в контекстном меню Конструктора БД задать команду Referential Integrity (ссылочная целостность), что и приведет к открытию окна

Построителя ссылочной целостности данных (рис. 12.6).

458

Часть 3. Современные СУБД и их применение

Referential Integrity Builder

 

Rules for Updating | Rules for Deleting

Rules for Inserting j

Which rule do you want to apply when a new record is inserted or an existing record is updated in the child table?

СRestrict: prohibits the insert if a matching key value does not exist in the parent table, ignore: allows the insert.

Parent Table

Child Table

Update

Delete

Insert

Parent Tag

Child Tag

t_dolgn

t_prep

Cascade

Restrict

Restrict

i_dolgn

i_dolgn

t_prep

t_zagr

Cascade

Restrict

Restrict

i_fio

i fio

* t_stag

t_prep

Restrict

Ignore

Ш Я Е

i_stag

i_stag

Help

OK

Cancel

Рис. 12.6. Диалоговое окно Referential Integrity Builder

Вокне Построителя перечислены все постоянные связи между таблицами БД Bdu. Информация по каждой связи размещена в отдельной строке. Первые два столбца содержат имена родительских и дочерних таблиц. Следующие три столбца содержат правила поддержания ссылочной целостности в случае редактирования, удаления и добавления записей соответственно. Изначально все правила содержат Ignore, но они определяются для каждой связи и каждой из трех перечисленных операций. Последние два столбца содержат индексы (теги) родительской и дочерней таблиц, по которым осуществляется связь.

Вдиалоговом окне Построителя ссылочной целостности коррективам могут быть подвергнуты только столбцы с правилами. Наша задача — для каждой связи (пары родительской и дочерней таблицы) определить правила поддержания ссылочной целостности при выполнении каждой из трех возможных операций с данными этих таблиц (редактирования, добавления и удаления). Этот выбор можно осуществить двумя способами:

• при выборе поля одного из столбцов с правилами Update (обновить), Delete (удалить) и Insert (вставить) появляется кнопка, нажатие которой приводит к появлению списка возможных правил;

• при выборе одной из вкладок Rules for Updating (правила обновле-

ния), Rules for Deleting (правила удаления), Rules for Inserting (правила вставки) в верхней части таблицы появляются переключатели с комментариями для каждого из правил.

Например, при выборе вкладки Rules for Updating (правила обновления)

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

12. СУБД Visual FoxPro 8.0

4 59

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

 

 

 

 

 

 

Таблица 12.7

 

Правила изменения значений первичного ключа

Н а и м е н о в а н ие

 

О п и с а н и е

 

 

C a s c a d e

П р и и з м е н е н и и

з н а ч е н и й

п о л е й п е р в и ч н о г о к л ю ч а

или к л ю ч а -

 

к а н д и д а т а в р о д и т е л ь с к о й т а б л и ц е а в т о м а т и ч е с к и

 

 

о с у щ е с т в л я е т с я и з м е н е н и е в с е х с о о т в е т с т в у ю щ и х з н а ч е н и й в

 

д о ч е р н е й т а б л и ц е — к а с к а д н о е и з м е н е н и е .

 

Restrict

З а п р е щ а е т с я и з м е н е н и е

п е р в и ч н о г о к л ю ч а или к л ю ч а - к а н д и д а т а

 

в р о д и т е л ь с к о й

т а б л и ц е ,

е с л и

в д о ч е р н е й т а б л и ц е

и м е е т с я хотя

 

бы о д н а з а п и с ь ,

в н е ш н и й

ключ

к о т о р о й

с о д е р ж и т

и з м е н я е м о е

 

з н а ч е н и е .

 

 

 

 

 

Ignore

Д о п у с к а е т с я п р о и з в о л ь н о е и з м е н е н и е

з н а ч е н и й п о л е й

 

п е р в и ч н о г о к л ю ч а и л и к л ю ч а - к а н д и д а т а р о д и т е л ь с к о й т а б л и ц ы .

 

Ц е л о с т н о с т ь д а н н ы х н е п о д д е р ж и в а е т с я .

 

Выбор любого из правил осуществляется установкой соответствующего переключателя. Выбранное правило отображается в соответствующей строке столбца Update (обновить).

При удалении записей из связанных таблиц (вкладка Rules for Deleting — правила удаления) требуется использование также трех правил (табл. 12.8).

Таблица 12.8

Правила удаления записей из связанных таблиц

Наименование

О п и с а н и е

 

C a s c a d e

У д а л е н и е з а п и с е й в р о д и т е л ь с к о й т а б л и ц е а в т о м а т и ч е с к и

 

 

п р и в о д и т к к а с к а д н о м у у д а л е н и ю в с е х з а п и с е й д о ч е р н е й

 

 

т а б л и ц ы , и м е ю щ и х а н а л о г и ч н ы е з н а ч е н и я с о о т в е т с т в у ю щ е г о

 

 

в н е ш н е г о ключа .

 

Restrict

З а п р е щ а е т с я у д а л е н и е з а п и с и в р о д и т е л ь с к о й т а б л и ц е , е с л и

в

 

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

 

к о т о р о й с о д е р ж и т з н а ч е н и е , с о в п а д а ю щ е е с о з н а ч е н и е м

 

 

п е р в и ч н о г о к л ю ч а или к л ю ч а - к а н д и д а т а в у д а л я е м о й з а п и с и .

П р и

 

п о п ы т к е у д а л е н и я з а п и с и в ы д а е т с я с о о б щ е н и е о б о ш и б к е ,

 

 

к о т о р у ю м о ж н о о б р а б о т а т ь п р о г р а м м н о .

 

Ignore

Д о п у с к а е т с я н е о г р а н и ч е н н о е у д а л е н и е з а п и с е й р о д и т е л ь с к о й

 

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

 

4 6 0 Часть 3. Современные СУБД и их применение

Правила для добавления записей применимы со стороны дочерней таблицы. Их всего два (табл. 12.9).

 

Правила добавления записей

Таблица 12.9

 

 

Н а и м е н о в а н ие

Описание

 

Restrict

З а п р е щ а е т с я д о б а в л е н и е з а п и с и к д о ч е р н е й т а б л и ц е , е с л и в

 

р о д и т е л ь с к о й т а б л и ц е о т с у т с т в у е т з а п и с ь , з н а ч е н и е п е р в и ч н о г о

 

ключа или к л ю ч а - к а н д и д а т а к о т о р о й н е с о в п а д а е т

с о з н а ч е н и е м

 

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

 

Ignore

Д о п у с к а е т с я н е о г р а н и ч е н н о е

д о б а в л е н и е з а п и с е й

в д о ч е р н ю ю

 

таблицу . Ц е л о с т н о с т ь д а н н ы х

н е п о д д е р ж и в а е т с я .

 

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

При формировании правил ссылочной целостности (рис. 12.6) мы рассуждали следующим образом:

1. Изменение значений ключевых полей родительских таблиц. Таблица Т Р г е р является дочерней по отношению к таблицам T D o l g n и T_Stag, в свою очередь, для нее дочерней является таблица T Z a g r . Не будем исключать возможность изменения названия должности или фамилии преподавателя. Соответствующие поля являются ключевыми. При необходимости такие изменения необходимо произвести в родительских таблицах соответственно: должность в — T_Dolgn, а фамилию в — Т Ргер. В этом случае они синхронно (каскадно) изменятся в дочерних таблицах. Запретим изменения значений ключевого поля stag (стаж) в родительской таблице T Stag.

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

3.Изменение (добавление) записей в дочерней таблице. Запретим ввод

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

Проверим средства обеспечения ссылочной целостности в действии.

12. СУБД Visual FoxPro 8.0

461

Откроем БД Bdu с помощью команды File | Open (файл | открыть) системного меню Visual FoxPro (если она закрыта). В появившемся окне Конструктора БД откроем для просмотра таблицу Т_ргер. Для этого установим курсор на эту таблицу и, вызвав всплывающее меню, зададим команду Browse (просмотр).

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

Замечание.

При необходимости произвести добавление или изменение защищенных данных (режим Restrict) нужно снять защиту и после выполнения требуемых действий повторно установить защиту.

1 2 . 1 0 . С о з д а н и е з а п р о с о в

После создания таблиц БД и ввода в них данных требуется организовать доступ к хранящейся в БД информации для просмотра и обработки. Одним из основных способов решения названной задачи является создание запросов.

Средства формирования запросов

Выборка информации из БД может осуществляться: с помощью команды SELECT SQL языка Visual FoxPro, которая является аналогом соответствующей команды языка SQL; с помощью Мастера запросов и с помощью Конструктора запроса.

Команда SELECT имеет множество возможностей (опций). Ее упрощенное представление имеет следующий вид:

SELECT СгшсокВыбираемыхПолей

FROM СписокТаблиц-исгочника данных [ INTO ИмяТаблицы получателя данных|

[WHERE УсловиеВыборки] [GROUP BY УсловиеГруппировки]

[ORDER BY УсловиеУпорядочивания выводимых данных]

[ТО FILE ИмяФайла | ТО PRINTER — направление вывода данных] Квадратные скобки указывают на необязательность опции.

Конструктора запроса позволяет:

выбирать данные из одной или нескольких таблиц, используя сложные критерии;

462

Часть 3. Современные СУБД и их применение

устанавливать временные связи между таблицами;

выбирать поля и записи таблиц с требуемыми данными;

выполнять вычисления с использованием выбранных данных.

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

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

Для вызова Конструктора запроса после открытия БД можно воспользоваться командой File | New (файл | Создать) системного меню Visual FoxPro. При выполнении этой команды открывается диалоговое окно New (рис. 12.2),

вкотором нужно выбрать переключатель Query (Запрос) и нажать кнопку

New File (Новый файл). В открывшемся диалоговом окне Add Table or View (Добавить таблицу или просмотр) следует выбрать одну или несколько таблиц и нажать ОК. В результате откроется окно Конструктора запроса (рис. 12.7), содержащее выбранные таблицы, а в системном меню Visual FoxPro появится пункт Query (Запрос).

uery Designer - Queryl

 

штш

 

 

Query Designer

fio

 

@ol%NI Wil oil <f|

stag

 

 

dolgn

 

 

kaf

 

 

J!l

 

 

LfMds j | Join j Filter ] Order By j

Group By

j Miscellaneous

Available fields:

 

Selected fields:

T_prep.fio

i j

 

T_prep.stag

 

Add A l l »

T_prep. dolgn

 

T_prep.kaf

 

R amove

 

 

Functions and expressions:

zl

•:'< Remove Al

 

 

Рис. 12.7. Окно Конструктора запроса с таблицей T PREP