Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции БДиСУБД.docx
Скачиваний:
19
Добавлен:
19.11.2019
Размер:
494.91 Кб
Скачать

Генераторы

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

Восновном,генераторыиспользуютдлясозданияавтоинкрементныхполей.Длякаждоготакогополяпридетсясоздаватьсобственныйгенератор.Генератор,совместнососпециальнымтриггером,гарантирует,чтозначениеэтогополявсегдабудетуникальным.СоздаютсягенераторыспомощьюоператораCREATEGENERATOR:

CREATEGENERATORGen1;

Внимание!Генераторыможносоздавать,ноудалитьихнеполучится,поэтомувреальнойбазеданныхпреждепродумайте,какиегенераторыувасбудут,апотомтолькосоздавайтеих.ОткройтеутилитуIBConsole,войдитевлокальныйсервериоткройтенашубазуданныхFIRST.ЗатемзапуститеInteractiveSQL,исоздайтегенераторGen1,каквпримеревыше.Затемвыделитераздел"Generators"вдеревесерверов,ивправойчастивыувидитенашгенератор,атакжееготекущеезначение:

Рис.3.3.Раздел"Generators"базыданных

Каквидноизрисунка,генераторусразуприсваиваетсязначение0.Темнеменее,воизбежаниевозможныхошибок,вторымшагомнередкоприсваиваютгенераторуэтозначениеоператоромSETGENERATOR:

SETGENERATORGen1TO0;

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

Иногдабываетнеобходимымприсваиватьгенераторуненулевое,адругоезначение.Например,есливыперенеслибазуданныхизParadoxвInterBase.Вэтомслучае,таблицаужесодержитзаписи,которыепронумерованы.АвтоинкрементноеполеприпереносепревращаетсявINTEGER.Требуетсяпосмотретьпоследнеезначениеэтогополя,иприсвоитьгенераторуименноего.

Увеличениешагагенератора

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

GEN_ID(Gen1,1)

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

SELECTGEN_ID(Gen1,1)FROMRDB$DATABASE;

ВнижнемокнеInteractiveSQLбудетвыведенрезультат:

Рис.3.4.РезультатSQL-запроса

Каквидноизрисунка,мыполучилизначение1.ВыполнитетакжекомандуCOMMIT,чтобызавершитьтранзакцию,затемзакройтеInteractiveSQL.ВыделитеразделGeneratorsиубедитесь,чтозначениеизменилось.Что,собственно,произошло?Деловтом,чтокогдавысоздаетеновуюбазуданных,InterBaseпреждевсегосоздаетвнейсобственныесистемныетаблицы.ОднойизтакихтаблицявляетсяRDB$DATABASE,котораявсегдахраниттолькооднузаписьснекоторымисистемнымипараметрамибазыданных.Этужетаблицуиногдаприменяютдля"пустых"запросов,которыевозвращаютзначениеоднойизпеременныхиливычисляемоезначение.Нашимпредыдущимзапросоммывначалеувеличилизначениегенераторана1,затемвывелиегонаэкраноператоромSELECT.Узнатьтекущеезначениегенератора,неувеличиваяего,можнострокой:

SELECTGEN_ID(Gen1,0)FROMRDB$DATABASE;

гдевпроцедуреGEN_ID()указываетсяшаг0.

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

Совет:еслигенераторуженаходитсявиспользовании,врабочейбазеданных,НИКОГДАнепереустанавливайтеегозначенийвручную-эточреватопорчейцелостностиидостоверностиданных.