Головне меню

EN | RU | UK

На головну

ДОДАТОК В. Додавання інформації у БД «БІБЛІОТЕКА»

Допомога & Консультація
Допомога & Консультація
Пишіть мені в
Наверх сторінки
Додаток В
Мета

Мета: розкрити особливості додавання інформації в реляційну базу даних, не порушуючи цілісності сутностей, посилальної цілісності та корпоративні обмеження цілісності.

В.1. Послідовність заповнення таблиць

Розробник баз даних повинен розуміти послідовність заповнення таблиць інформацією до створення фізичної моделі реляційної бази даних. Строго кажучи, вона збігається з порядком створення таблиць БД. Дотримуйтесь цього правилу і не будете помилятися. Але не забувайте, що чим складніше БД, тим більше варіантів послідовностей створення і заповнення таблиць інформацією. Вам потрібно буде вибрати оптимальний варіант для цього.

На етапі фізичного моделювання реляційної бази даних визначаються механізми цілісності сутностей, посилальної цілісності і корпоративні обмеження цілісності. Вони накладають ряд необхідних обмежень на введення, коригування та видалення інформації з таблиць БД. Ці обмеження визначають послідовність заповнення таблиць. Якщо все зроблено правильно, то у користувачів не буде ніяких шансів обійти ці механізми.

Заповнення інформацією навчальної БД «БІБЛІОТЕКА» є необхідним етапом навчання. Порядок введення інформації в її таблиці збігається з послідовністю їх створення. Такий підхід дозволить без помилок ввести інформацію в БД навіть при відсутності ряду необхідних обмежень. Їх Вам буде запропоновано додати самостійно на практичних заняттях.

В.2. Таблиця PhoneTypes («ТИПИ ТЕЛЕФОНІВ»)

Введення інформації у таблицю PhoneTypes обмежено цілісністю сутностей та корпоративними обмеженнями цілісності. За цілісність сутності відповідає первинний ключ Code. Він був визначений в однойменному стовпці Code. Корпоративні обмеження цілісності забезпечуються доменами AllCode і AllNameType (див. таблицю PhoneTypes у фізичній моделі «БІБЛІОТЕКА»).

Фізичне моделювання бази даних почнемо з опису двох типів механізмів, що забезпечують унікальні значення первинних ключів. Перший тип більш поширений і зрозумілий. Він задає автоінкремент для ключового стовпця типу INTEGER в операторі CREATE TABLE. В СУБД Interbase реалізований другий тип. Він визначає унікальне значення ключа за допомогою генератора. Його необхідно створити за допомогою оператора CREATE GENERATOR. Ми це зробили для первинного ключа таблиці PhoneTypes:

       CREATE GENERATOR PhoneTypesCode;

Тепер необхідно задати його початкове значення. В СУБД Interbase для цього використовується оператор SET GENERATOR. Генератори зазвичай встановлюються на початкове значення, яка дорівнює нулю. Оператор, який визначає початкове значення для генератора PhoneTypesCode, виглядає так:

       SET GENERATOR PhoneTypesCode TO 

Обидва механізми генерують унікальне значення первинного ключа в операторі INSERT, коли він додає новий рядок в таблицю. Механізм автоінкремента не вимагає наявності ключового стовпця для додавання нового рядка. Механізм генераторів вимагає використання функції GEN_ID() в кожному операторі INSERT для ключового стовпця.

Функція GEN_ID() задає крок зміни значення генератора. Крок можна міняти для кожного нового рядка, якщо це необхідно. Нижче наведені оператори INSERT з функцією GEN_ID() для додавання інформації в таблицю PhoneTypes:

INSERT TABLE PhoneTypes

    (Code, Name)

VALUES

    (GEN_ID(PhoneTypesCode, 1), 'Домашній');

INSERT TABLE PhoneTypes

    (Code, Name)

VALUES

    (GEN_ID(PhoneTypesCode, 1), 'Робочий');

INSERT TABLE PhoneTypes

    (Code, Name)

VALUES

    (GEN_ID(PhoneTypesCode, 1), 'Мобільний');

INSERT TABLE PhoneTypes

    (Code, Name)

VALUES

    (GEN_ID(PhoneTypesCode, 1), 'Супутниковий');

В результаті послідовної роботи чотирьох операторів INSERT в таблицю PhoneTypes було додано чотири рядки (Додаток Г). Щоразу функція GEN_ID() задавала крок збільшення значення Code на 1. Для цього використовувався генератор PhoneTypesCode. Для нього початкове значення дорівнювало 0. Тому значення в стовпці Code у першому рядку таблиці PhoneTypes дорівнює 1 (табл. В.1).

Таблиця В.1

Інформація в таблиці PhoneTypes («ТИПИ ТЕЛЕФОНІВ»)
Code Name
1 Домашній
2 Робочий
3 Мобільний
4 Супутниковий

 

В.3. Таблиця PassportData («ПАСПОРТНІ ДАНІ»)

Додавання інформації в таблицю PassportData має наступні особливості. В операторі CREATE TABLE для цієї таблиці не визначений первинний ключ по стовпцю Code. Однак, для цілісності сутності «Паспорт» і посилальної цілісності БД «БІБЛІОТЕКА» необхідно забезпечити унікальність значень в цьому стовпці. Для цього створимо генератор PassportDataCode:

CREATE GENERATOR PassportDataCode;

SET GENERATOR PassportDataCode TO 

Принцип дії генераторів ми розглянули раніше. Корпоративні обмеження цілісності в таблиці PassportData були описані в фізичної моделі бази даних «БІБЛІОТЕКА». Нижче наведено приклад операторів INSERT, які додають перші два рядки в таблицю PassportData.

INSERT TABLE PassportData

    (Code, Series, Number, Birthday, BirthPlace, Sex, IssuePlace, IssueDate)

VALUES

    (GEN_ID(PassportDataCode, 1), 'АА', 45003, '05/30/1930', 'Росія, г.Опочки', 'Ж', 'Дніпропетровськ', '01/12/1995');

INSERT TABLE PassportData

    (Code, Series, Number, Birthday, BirthPlace, Sex, IssuePlace, IssueDate)

VALUES

    (GEN_ID(PassportDataCode, 1), 'АА', 15700, '02/23/1930', 'Росія. м.Володимир', 'Ж', 'Житомир', '03/16/2000');

Всього у таблицю PasportData введено 24 рядки (Додаток Г). Вся інформація, яка була додана, наведена в таблиці В.2.

Таблиця В.2

Інформація в таблиці PasportData («ПАСПОРТНІ ДАНІ»)
Code Series Number Birthday Birthplace Sex Issueplace Issuedate Note
1 АА 45003 30.05.1930 Росія, м. Опочки Ж Дніпропетровськ 12.01.1995 NULL
2 АА 15700 23.02.1930 Росія. м. Володимир Ж Житомир 16.03.2000 NULL
3 АБ 87134 20.01.1963 Дніпропетровська область, село Солоне Ж Дніпропетровська область, село Солоне 10.01.1998 NULL
4 АЕ 12300 12.11.1960 Україна, м. Донецьк Ч Донецьк 15.12.1991 NULL
5 АЕ 1067 19.07.1981 Україна, Дніпропетровськ Ч Дніпропетровськ 25.08.1997 NULL
6 АЖ 1568 14.09.1956 Казахстан, місто Павлодар Ч Київ 24.05.1999 NULL
7 АЗ 43188 13.11.1970 Дніпропетровська область, м. Дніпродзержинськ Ж Дніпропетровська область, м. Дніпродзержинськ 15.05.1998 NULL
8 АК 23490 05.01.1961 Росія, місто Самара Ж Дніпропетровськ 13.09.2000 NULL
9 АС 90843 10.10.1949 Молдова, місто Кишинів Ж Дніпропетровськ 13.12.1998 NULL
10 АЯ 90764 14.11.1950 Україна, місто Миколаїв Ж м. Миколаїв 11.11.1998 NULL
11 ІК 10842 19.07.1949 Україна, м. Кіровоград Ч Дніпропетровськ 06.01.1998 NULL
12 ІК 45190 18.07.1983 Дніпропетровська область, село Петропавлівка Ж Дніпропетровська область, село Петропавлівка 20.09.1999 NULL
13 АН 61327 01.10.1960 Росія, Санкт-Пітербург Ж Санкт-Пітербург 12.10.1976 NULL
14 АН 64277 23.12.1972 Україна, м. Львів Ч Львів 06.01.1988 NULL
15 АК 89125 07.05.1980 Україна, м. Київ Ч Київ 10.01.1998 NULL
16 АК 55706 07.04.1965 Донецьк Ж Донецьк 20.04.1982 NULL
17 АС 73271 05.07.1950 Крим Ч Сімферополь 23.08.1970 NULL
18 АЖ 45879 04.02.1961 Дніпропетровськ Ж Дніпродзержинськ 14.03.1980 NULL
19 АС 12548 08.04.1974 Трускавець Ж Прикарпаття 28.05.1989 NULL
20 АК 12578 11.11.1987 Донецьк, Краматорськ Ж Київ 26.01.2000 NULL
21 АС 55489 25.09.1981 Суми Ж Харків 06.11.1999 NULL
22 АЯ 45789 07.08.1972 Угорщина Ж Івано-Франківськ 03.10.1988 NULL
23 АЖ 35126 18.03.1975 Одеса Ж Одеса 19.06.1993 NULL
24 АН 15625 19.06.1966 Дніпропетровськ Ч Дніпропетровськ, Петриківка 12.08.1982 NULL

 

В.4. Таблиця Librarians («БІБЛІОТЕКАРИ»)

У таблиці Librarians цілісність сутності забезпечує первинний ключ по стовпцю Code. За унікальність його значень відповідає генератор LibrariansCode.

CREATE GENERATOR LibrariansCode;

SET GENERATOR LibrariansCode TO 

Робота генераторів описана для таблиці PhoneTypes. Корпоративні обмеження цілісності таблиці Librarians забезпечуються доменами. Їх повний список наведено у фізичної моделі БД «БІБЛІОТЕКА» (Додаток Б).

Механізми посилальної цілісності для таблиці Librarians не реалізовані. Це зроблено спеціально. Не забувайте, що БД «БІБЛІОТЕКА» призначена для навчання. Якщо Ви вважаєте себе фахівцем, то спробуйте дописати їх в script-файл самостійно. Почніть з зовнішніх ключів. Але, найбільш корисно це буде зробити, використовуючи тригера і процедури. Залишилося додати, що в script-файлі реалізовані подібні механізми для таблиці, яка дуже схожа на таблицю Librarians. Спробуйте відповісти на питання: яка це таблиця?

Нижче наведені оператори INSERT для додавання перших двох рядків в таблицю Librarians.

INSERT TABLE Librarians

    (Code, ClockNumber, FamilyName, Name, Patronymic, PassportCode, Post, HomePhone)

VALUES

    (GEN_ID(LibrariansCode, 1), 28, 'Іванова', 'Олена', 'Володимирівна', 2, 'Бібліотекар', '52‑XX‑75');

INSERT TABLE Librarians

    (Code, ClockNumber, FamilyName, Name, Patronymic, PassportCode, Post, HomePhone)

VALUES

    (GEN_ID(LibrariansCode, 1), 12, 'Ніколаєнко', 'Любов', 'Миколаївна', 10, 'Бібліотекар', '46‑XX‑19');

Всього в таблицю Librarians додано 12 рядків (Додаток Г). Вони наведені нижче в таблиці В.3.

Таблиця В.3

Інформація в таблиці Librarians («БІБЛІОТЕКАРИ»)
Code ClockNumber FamilyName Name Patronymic PasportCode Post HomePhone Note
1 28 Іванова Олена Володимирівна 2 Бібліотекар 52-XX-75 NULL
2 12 Ніколаєнко Любов Миколаївна 10 Бібліотекар 46-XX-19 NULL
3 187 Іноземцева Іванна Модестівна 9 Ст. бібліотекар 775-XX-00 NULL
4 83 Мальцева Діана Петрівна 12 Бібліотекар 29-XX-15 NULL
5 10 Сизранцева Тетяна Ігорівна 3 Бібліотекар 370-XX-22 NULL
6 100 Ставка Лілія Іванівна 7 Бібліотекар 22-XX-01 NULL
7 50 Лещенко Алла Федорівна 13 Бібліотекар 722-XX-36 NULL
8 36 Сіра Лідія Іванівна 19 Бібліотекар 254-XX-02 NULL
9 45 Прохіна Тамара Львівна 21 Бібліотекар 63-XX-01 NULL
10 78 Самойленко Вікторія Ігорівна 20 Бібліотекар 125-XX-80 NULL
11 69 Степанова Олександра Миколаївна 16 Ст. бібліотекар 445-XX-65 NULL
12 17 Петрова Аліна Сергіївна 23 Бібліотекар 999-XX-05 NULL

 

В.5. Таблиця Readers («ЧИТАЧІ»)

У навчальній БД «БІБЛІОТЕКА» таблиця Readers має найбільш багатий набір інструментів для маніпулювання даними (Додаток Г). Вона є основою більш складної структурної одиниці - довідника «Читачі». Раніше це поняття не з’являлося.

Наддамо загальне визначення. Довідник – це одна або множина таблиць, що отримані в результаті нормалізації вихідного відношення. Тоді довідник «Читачі» – це множина таблиць, які отримані в результаті нормалізації вихідного відношення «ЧИТАЧІ» (Лекція «Нормалізація відношень», рис. 3.1).

Структуру довідника «Читачі» наочно видно на діаграмі зв'язків між відношеннями БД «БІБЛІОТЕКА». До нього увійшли таблиці, які побудовані на базі наступних відношень: «ЧИТАЧІ», «ПАСПОРТНІ ДАНІ», «ТЕЛЕФОНИ» і «ТИПИ ТЕЛЕФОНІВ». Далі ми будемо вести мову тільки про таблицю Readers («ЧИТАЧІ»).

Стовпець Code не визначений як первинний ключ таблиці Readers. Але цілісність сутності в ній і посилальна цілісність БД «БІБЛІОТЕКА» забезпечується унікальністю значень в цьому стовпці. За це відповідає генератор ReadersCode:

CREATE GENERATOR ReadersCode;

SET GENERATOR ReadersCode TO 

Робота механізму генераторів описана вище. Він використовується в операторах INSERT для додавання нових рядків у таблицю Readers. Приклад операторів для додавання перших двох рядків таблиці наведено нижче:

INSERT TABLE Readers

    (Code, FamilyName, Name, Patronymic, ReaderCardNumber, PassportCode, Job, Post)

VALUES

    (GEN_ID(ReadersCode, 1), 'Іванов', 'Петро', 'Іванович', 317, 4, 'НГУ, каф.ЕОТ', 'Асистент');

INSERT TABLE Readers

    (Code, FamilyName, Name, Patronymic, ReaderCardNumber, PassportCode, Job, Post)

VALUES

    (GEN_ID(ReadersCode, 1), 'Федорец', 'Ірина', 'Олегівна', 28, 1, 'НГУ, АХЧ', 'Вахтер');

Всього в таблицю Readers додано 12 рядків (Додаток Г). Ви можете їх побачити в таблиці В.4.

Таблиця В.4

Інформація в таблиці Readers («ЧИТАЧІ»)
Code FamilyName Name Patronymic ReaderCardNumber PasportCode Job Post Note
1 Іванов Петро Іванович 317 4 НГУ, каф. ЕОТ Асистент NULL
2 Федорец Ірина Олегівна 28 1 НГУ, АХЧ Вахтер NULL
3 Ільїн Іван Петрович 1345 11 НГУ, каф. фізики Доцент NULL
4 Суренко Дмитро Павлович 543 6 НГУ, каф. геофізики Ст. викладач NULL
5 Коршунова Наталя Юріївна 128 8 НГУ, каф. геоіформатики Асистент NULL
6 Носенко Олег Володимирович 5672 5 НГУ, ІКК Інженер NULL
7 Брусов Володимир Михайлович 485 24 НГУ, каф. геодезії Лаборант NULL
8 Козирєв Олексій Сергійович 759 15 НГУ, каф. кримінології Професор NULL
9 Левченко Юлія Павлівна 146 18 НГУ, каф. політичної теорії Завідувач кафедри NULL
10 Світла Тетяна Іванівна 2021 22 НГУ, каф. перекладу Ст. викладач NULL
11 Щиглів Петро Євгенович 997 14 НГУ, каф. електропостачання Асистент NULL
12 Кириленко Віктор Олександрович 1010 17 НГУ, каф. електроприводу Заступник декана NULL

 

В.6. Таблиця Phones («ТЕЛЕФОНИ»)

Таблиця Phones має істотну відмінність від усіх таблиць, які були розглянуті раніше. На етапі логічного моделювання для неї був визначений складений потенційний ключ. Унікальність значень складеного потенційного ключа забезпечує цілісність сутності в таблиці Phones. Це номер телефону читача (Додаток А).

Механізм генераторів не підходить для підтримки унікальності значень складених потенційних або первинних ключів. Замість нього тут працює механізм тригерів (Додаток Г). Тому Ви не побачите функцій GEN_ID() в операторах INSERT для додавання нових рядків у таблицю Phones. Дивіться нижче додавання перших двох рядків:

INSERT TABLE Phones

    (ReaderCode, PhoneTypesCode, PhoneNumber)

VALUES

    (1, 1, '29-XX-15');

INSERT TABLE Phones

    (ReaderCode, PhoneTypesCode, PhoneNumber)

VALUES

    (1, 2, '98-XX-88');

Всього в Phones додано 25 рядків (Додаток Г). Вони наведені нижче в таблиці В.5.

Таблиця В.5

Інформація в таблиці Phones («ТЕЛЕФОНИ»)
ReaderCode PhoneTypeCode PhoneNumber
1 1 29-XX-15
1 2 98-XX-88
1 3 38053198XX87
2 2 47-XX-10
3 1 68-XX-09
4 1 370-XX-20
4 3 38097567XX54
5 1 744-XX-00
6 1 33-XX-35
6 3 38096231XX83
8 1 68-XX-58
8 2 47-XX-45
8 3 38063257XX88
9 1 144-XX-48
9 2 32-XX-02
9 3 38097555XX22
10 1 56-XX-01
10 2 89-XX-98
10 3 38053456XX52
11 1 789-XX-97
11 2 47-XX-96
11 3 38054022XX84
12 1 777-XX-45
12 2 41-XX-39
12 3 38067454XX21

 

В.7. Таблиця Books («КНИЖКИ»)

У таблиці Books цілісність сутності підтримується первинним ключем по стовпцю Code. Він також відповідає за посилальну цілісність БД «БІБЛІТЕКА» За унікальність значень в стовпці Code відповідає генератор BooksCode:

CREATE GENERATOR BooksCode;

SET GENERATOR BooksCode TO 

Робота генераторів описана на прикладі таблиці PhoneTypes. Нижче наведені оператори INSERT для додавання перших двох строк в таблицю Books.

INSERT TABLE Books

    (Code, Name, IssueYear, Drawing, BookPublishers, UDK, Cipher)

VALUES

    (GEN_ID(BooksCode, 1), 'Автоматизація виробничих процесів на збагачувальній фабриці', '01/01/1985', 60000, «Надра», '622.7', '622.7‑52 ⁄Т');

INSERT TABLE Books

    (Code, Name, IssueYear, Drawing, BookPublishers, UDK, Cipher)

VALUES

    (GEN_ID(BooksCode, 1), 'Розв'язання завдань по автоматизації процесів збагачення й металургії', '01/01/1969', 200000, «Наука», '622.7‑52', '622.7‑52(075) ⁄Т');

У script-файлі в таблицю Books додано 14 рядків за допомогою операторів INSERT (Додаток Г). Результат їхньої роботи дивіться нижче (таблиця В.6).

Таблиця В.6

Інформація в таблиці Books («КНИЖКИ»)
Code Name IssueYear Drawing BookPublishers UDK Cipher Note
1 Автоматизація виробничих процесів на збагачувальній фабриці 01.01.1985 6000 «Надра» NULL 622.7-52/Т NULL
2 Розв'язання завдань по автоматизації процесів збагачення й металургії 01.01.1969 2000 «Наука» NULL 622.7-52(075)/Т NULL
3 Асимптотичні методи оптимального керування 01.01.1987 1000 «Автомат» NULL 681.513.5:/А NULL
4 Синтез оптимальних автоматичних систем 01.31.1984 5000 «Автомат» NULL 681.513.5:/ДО NULL
5 Методи оптимізації стохастичних систем 01.01.1987 4500 «Матстат» NULL 681.513.5:/ДО NULL
6 Автоматизовані системи керування технологічним процесом збагачення руди 31.01.1987 4000 «Автомат» NULL 622.7-52/П NULL
7 C/C++ Програмування мовою високого рівня 11.01.2007 5500 «Пітер» NULL 681.3.06(075) NULL
8 Комп'ютерні мережі. Принципи, технології, протоколи 31.01.2006 6000 «Пітер» NULL 004.72(075) NULL
9 Довідник по диференціальних рівняннях з приватними похідними першого порядку 31.01.2003 10000 «ФИЗМАТЛІТ» NULL 517.9 NULL
10 Теорія ймовірностей й математична статистика 31.01.2004 1000 «Пітер» NULL 519.2 NULL
11 C#. Програмування мовою високого рівня 31.01.2009 1500 «Пітер» NULL 004.43 NULL
12 Теорія імовірностей й математична статистика 31.01.2005 2000 «Вища школа» NULL 519.2 NULL
13 Теорія імовірностей й математична статистика 31.01.2002 2500 «ФИЗМАТЛІТ» NULL 519.2 NULL
14 Дискретно-групові методи інтегрування звичайних диференціальних рівнянь 31.01.1991 7000 «ЛІІАН» NULL 517.9-37 NULL

 

В.8. Таблиця BookAuthors («АВТОРИ КНИЖОК»)

Первинний ключ по стовпцю Code відповідає за цілісність сутності в таблиці BookAuthors і за посилальну цілісність БД «БІБЛІОТЕКА». Унікальність значень первинного ключа підтримує генератор BookAuthorsCode:

CREATE GENERATOR BookAuthorsCode;

SET GENERATOR BookAuthorsCode TO 

Робота механізму генераторів описана на прикладі таблиці PhoneTypes. Нижче наведені оператори INSERT, які додають перші два рядки в таблицю BookAuthors:

INSERT TABLE BookAuthors

    (Code, FamilyName, Name, Patronymic, Birthday)

VALUES

    (GEN_ID(BookAuthorsCode, 1), 'Тіхонов', 'Олег', 'Миколайович', '01/31/1940');

INSERT TABLE BookAuthors

    (Code, FamilyName, Name, Patronymic, Birthday)

VALUES

    (GEN_ID(BookAuthorsCode, 1), 'Акуленко', 'Леонід', 'Дмитрович', '03/12/1934');

Таблиця BookAuthors містить 16 рядків. Усі вони сформовані в script-файлі операторами INSERT (Додаток Г). Результати їх роботи наведені в таблиці В.7.

Таблиця В.7

Інформація в таблиці BookAuthors («АВТОРИ КНИЖОК»)
Code FamilyName Name Patronymic Birthday DeatheDay ShortBiography Note
1 Тіхонов Олег Миколайович 12.07.1945 NULL NULL NULL
2 Акуленко Леонід Дмитрович 26.11.1962 NULL NULL NULL
3 Процуто Віктор Сергійович 14.08.1950 NULL NULL NULL
4 Колосов Геннадій Євгенович 01.06.1950 NULL NULL NULL
5 Козаков Ігор Єлисейович 18.09.1962 NULL NULL NULL
6 Павловська Тетяна Олександрівна 03.08.1967 NULL NULL NULL
7 Зайцев Валентин Федорович 03.07.1955 NULL NULL NULL
8 Полянин Андрій Дмитрович 15.03.1939 NULL NULL NULL
9 Андронов Олександр Михайлович 18.06.1969 NULL NULL NULL
10 Копитов Євген Олександрович 09.03.1950 NULL NULL NULL
11 Гринглаз Леонід Якович 11.07.1950 NULL NULL NULL
12 Баврін Іван Іванович 12.09.1949 NULL NULL NULL
13 Пугачов Володимир Семенович 03.02.1958 NULL NULL NULL
14 Оліфер Віктор Григорович 07.04.1961 NULL NULL NULL
15 Оліфер Наталя Олексіївна 11.12.1965 NULL NULL NULL
16 Флегонтов Олександр Володимирович 07.07.1963 NULL NULL NULL

 

В.9. Таблиця CoAuthorship («СПІВАВТОРСТВО»)

У фізичної моделі БД «БІБЛІОТЕКА» визначено складений первинний ключ для таблиці CoAuthorship. До його складу входять всі її стовпці. Ви вже знаєте, що генератори не підходять для підтримки унікальності значень складених потенційних або первинних ключів. Для цього необхідно використовувати тригери та процедури.

У script-файлі не прописані тригери і процедури для забезпечення унікальних значень потенційного ключа таблиці CoAuthorship. Такий підхід можливий. Він базується на внутрішніх механізмах СУБД. Вони генерують виняткову ситуацію при спробі введення неунікального значення для первинного ключа. Нижче наведені оператори INSERT для додавання трьох перших рядків у таблицю CoAuthorship.

INSERT TABLE CoAuthorship

    (BookCode, AuthorCode)

VALUES

    (1, 1);

INSERT TABLE CoAuthorship

    (BookCode, AuthorCode)

VALUES

    (2, 1);

INSERT TABLE CoAuthorship

    (BookCode, AuthorCode)

VALUES

    (3, 2);

Послідовність додавання інформацію в таблицю CoAuthorship має значення. Розглянемо її на прикладі третього рядка. У ньому значення зовнішніх ключів BookCode та AuthorCode відповідно дорівнюють 3 і 2. Це означає, що в таблиці Books повинний бути рядок зі значенням первинного ключа Code, що дорівнює 3. Додатково в таблиці BookAuthors повинний бути рядок зі значенням первинного ключа Code, що дорівнює 2. Інакше правила посилальної цілісності БД «БІБЛІОТЕКА» згенерують виняткову ситуацію, використовуючи стандартні механізми СУБД Interbase. В цьому випадку третій рядок не буде доданий у таблицю CoAuthorship.

Всього у script-файлі додається 19 рядків в таблицю CoAuthorship (Додаток Г). Для додавання кожного рядка створений окремий оператор INSERT. Результати їх роботи Ви можете бачити в таблиці В.8.

Таблиця В.8

Інформація в таблиці Сoаuthorship («СПІВАВТОРСТВО»)
BookCode AuthorCode
1 1
2 1
3 2
4 4
5 5
6 3
7 6
8 14
8 15
9 7
9 8
10 9
10 10
10 11
11 6
12 12
13 13
14 16
14 7

 

В.10. Таблиця BookFunds («ТИПИ ФОНДІВ КНИЖОК»)

Цілісність сутності в таблиці BookFunds забезпечується унікальністю значень у стовпці Code. Він обраний в якості первинного ключа. Генератор BookFundsCode забезпечує унікальні ключові значення:

CREATE GENERATOR BookFundsCode;

SET GENERATOR BookFundsCode TO 

Принцип роботи генераторів описаний вище. Нижче наведені оператори INSERT, які додають два рядки в таблицю BookFundsCode:

INSERT TABLE BookFunds

    (Code, Name)

VALUES

    (GEN_ID(BookFundsCode, 1), 'НТБ');

INSERT TABLE BookFunds

    (Code, Name)

VALUES

    (GEN_ID(BookFundsCode, 1), 'Студентський');

У таблиці BookFundsCode всього два рядки. Тому можете бачити усі оператори INSERT зі script-файлу, які додають в неї інформацію. Результати їх роботи наведені у таблиці В.9.

Таблиця В.9

Інформація в таблиці BookFunds («ТИПИ ФОНДІВ КНИЖОК»)
Code Name
1 НТБ
2 Студентський

 

В.11. Таблиця BookInventoryNumbers («ІНВЕНТАРНІ НОМЕРИ КНИЖОК»)

У таблиці BookInventoryNumbers цілісність сутності забезпечується первинним ключем по стовпцю Code. Генератор BookInventoryNumbersCode створює унікальні значень для цього первинного ключа:

CREATE GENERATOR BookInventoryNumbersCode;

SET GENERATOR BookInventoryNumbersCode TO 

Механізм роботи генераторів описаний вище. Залишилося навести приклад операторів INSERT, які вводять перші два рядки в таблицю BookInventoryNumbers:

INSERT TABLE BookInventoryNumbers

    (Code, BookCode, FundCode, InventoryNumber, Cost)

VALUES

    (GEN_ID(BookFundsCode, 1), 1, 1, 4567890, 15.56);

INSERT TABLE BookInventoryNumbers

    (Code, BookCode, FundCode, InventoryNumber, Cost)

VALUES

    (GEN_ID(BookFundsCode, 1), 2, 1, 4510000, 22.33);

Розглянемо послідовність додавання інформації у другий рядок таблиці BookInventoryNumbers. Тут важливі значення зовнішніх ключів: BookCode = 2 і FundCode = 1. Без відповідних рядків в таблицях Books і BookFunds ми не зможемо ввести другий рядок в таблицю BookInventoryNumbers.

В обох таблицях первинний ключ визначений на стовпці Code. На них посилаються зовнішні ключі таблиці BookInventoryNumbers. Отже, спочатку необхідно додати рядок в таблицю Books, в якій значення Code = 2, а потім додати рядок в таблицю FundCode, де Code = 1. Тепер Ви зможете додати другий рядок у таблицю BookInventoryNumbers.

Усього в script-файлі додається 15 рядків в таблицю BookInventoryNumbers. Для додавання кожного рядка створений окремий оператор INSERT (Додаток Г). Результати їх роботи Ви можете бачити в таблиці В.10.

Таблиця В.10

Інформація в таблиці BookInventoryNumbers («ІНВЕНТАРНІ НОМЕРИ КНИЖОК»)
Code BookCode FundCode InventoryNumber Cost
1 1 1 4567890 15,56
2 2 1 4510000 22,33
3 3 1 4532477 34,01
4 4 1 4512890 12,99
5 5 2 4678532 56,78
6 6 2 4632112 10,10
7 7 2 7569832 73,50
8 7 2 5478956 45,10
9 8 2 2145876 59,25
10 9 1 5214786 36,05
11 10 1 5268933 74,20
12 11 2 7865890 21,32
13 12 1 6589321 36,69
14 13 1 7812639 48,13
15 14 1 7523690 27,99

 

В.12. Таблиця BookGiveOutRecord («ОБЛІК ВИДАЧІ КНИЖОК»)

У таблиці BookGiveOutRecord необхідно підтримувати цілісність сутності «Інвентарний номер книги». За це відповідає первинний ключ Code. Унікальність його значень забезпечує генератор BookGiveOutRecordCode:

CREATE GENERATOR BookGiveOutRecordCode;

SET GENERATOR BookGiveOutRecordCode TO 

Принципи роботи генераторів описані раніше для таблиці PhoneTypes. Нижче наведені оператори INSERT, які додають перші два рядки у таблицю BookGiveOutRecord:

INSERT TABLE BookGiveOutRecord

    (Code, ReaderCode, OutLibrarianCode, InventoryCode, IssueDate, ReturnDate, FactReturnDate, InLibrarianCode)

VALUES

    (GEN_ID(BookGiveOutRecordCode, 1), 2, 4, 6, '09/11/2004', '09/25/2004', '09/24/2004', 3);

INSERT TABLE BookGiveOutRecord

    (Code, ReaderCode, OutLibrarianCode, InventoryCode, IssueDate, ReturnDate, FactReturnDate, InLibrarianCode)

VALUES

    (GEN_ID(BookGiveOutRecordCode, 1), 3, 4, 4, '09/02/2004', '09/16/2004', '12/11/2004', 3);

У таблицю BookGiveOutRecord інформація була додана в останню чергу. Спробуйте оцінити масштаби підготовки до її вводу. Для того, щоб зафіксувати 10 випадків видачі книг читачам було введено 10 рядків в таблицю BookGiveOutRecord. Перед цим було додано 143 рядки у 10 таблиць.

На прикладі першого рядка розберемося з послідовністю додавання інформації в таблицю BookGiveOutRecord. Ми бачимо, що значення зовнішніх ключів OutLibrianCode, InventoryCode, InLibrianCode й стовпця ReaderCode відповідно дорівнюють 2, 3, 6 і 4. Отже, перед введенням першого рядка ми повинні виконати ряд дій. Їх послідовність довільна.

Введення першого рядка в таблицю BookGiveOutRecord ми почнемо з таблиці BookInventoryNumbers. У неї необхідно додати рядок, в якому значення первинного ключа Code дорівнює 6. Тепер прийшла черга таблиці Librarians. На її первинний ключ Code посилаються одразу два зовнішніх ключі таблиці BookGiveOutRecord. Отже, в таблицю Librarians нам необхідно ввести два рядки. У першому значення первинного ключа Code має дорівнювати 4, а у другому – 3. У таблиці Readers повинен з'явитися рядок зі значенням первинного ключа Code, що дорівнює 2. Тільки після всіх цих дій правила посилальної цілісності БД «БІБЛІОТКА» дадуть нам можливість ввести першій рядок у таблицю BookGiveOutRecord.

Для кожного рядка, що додається у таблицю BookGiveOutRecord, був створений окремий оператор INSERT (Додаток Г). Результати їх роботи Ви можете бачити в таблиці В.11.

Таблиця В.11

Інформація в таблиці BookGiveOutRecord («ОБЛІК ВИДАЧІ КНИЖОК»)
Code ReaderCode OutLlibrarianCode InventaryCode IssueDate ReturnDate FactreturnDate InLibrarianCode
1 2 4 6 11.09.2004 25.09.2004 24.09.2004 3
2 3 4 4 02.09.2004 16.09.2004 11.12.2004 3
3 6 4 3 02.09.2004 16.09.2004 16.09.2004 1
4 4 3 6 30.10.2004 13.11.2004 10.01.2005 6
5 7 10 7 10.11.2009 24.11.2009 24.11.2009 12
6 9 7 12 15.12.2009 29.12.2009 NULL NULL
7 11 8 10 06.02.2009 20.02.2009 19.02.2009 7
8 7 9 8 07.03.2009 21.03.2009 10.04.2009 10
9 9 8 12 05.02.2010 28.02.2010 NULL NULL
10 12 10 15 21.09.2010 05.10.2010 03.10.2010 9

 

Висновки

1. Цілісність сутності та посилальна цілісність реляційної БД підтримують за допомогою унікальних значень первинних ключів в таблицях, навіть якщо вони явно не визначені в операторах INSERT.

2. В сучасних СУБД унікальність цілочислових значень не складених первинних та потенційних ключів підтримують за допомогою генераторів або автоінкрементої властивості стовпця таблиці.

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

4. Порядок заповнення таблиць завжди може збігається з послідовністю їх створення. Однак це не завжди оптимальний шлях додавання інформації в таблиці реляційної бази даних.

© Куваєв Я.Г., 2005—2023.

Всі права захищені.

Вся інформація, яка розміщена на цьому веб-сайті, призначена тільки для персонального використання і не підлягає подальшому відтворенню і/або поширенню в будь-якій формі, інакше як за письмовим дозволом Автора.