Для створення поля, значення якого автоматично збільшується на одиницю, потрібно зробити кілька дій:
1. Створити генератор для ключового поля. Ключове поле повинно мати тип INTEGER, бути NOT NULL і оголошено як PRIMARY KEY. Власне, генератор можна використовувати для будь-якого Автоінкрементний поля, не обов'язково ключового. Але найчастіше генератори використовують саме для ключових полів.
2. Присвоїти генератору значення 0 (або інше, якщо таблиця перенесена з іншої БД, і вже містить записи).
3. Створити тригер BEFORE INSERT, що збільшує це значення на 1.
Отже, приступимо. В нашій базі даних є таблиця Tovar, в якій перше поле ID оголошено як INTEGER NOT NULL. На жаль, поле не було оголошено, як ключове PRIMARY KEY. Змінимо таблицю, додавши в неї первинний ключ по полю ID:
ALTER TABLE TOVAR ADD PRIMARY KEY (ID);
Тепер зробимо це поле Автоінкрементний:
CREATE GENERATOR GenTovar;
/ * Надаємо генератору початкове значення * /
SET GENERATOR GenTovar TO 0;
CREATE TRIGGER TrTovar FOR Tovar
ACTIVE BEFORE INSERT AS
IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID (Gen_Tovar, 1); ENDA
/ * Завершуємо транзакцію: * / COMMIT;
Оператори з даного прикладу створюють автоматичне збільшення значення поля на 1. Таким чином, вставка першої ж записи встановить значення 1. Наступний запис буде 2 і так далі. Все це реалізується в межах транзакції, тобто навіть якщо безліч користувачів вносить зміни в таблицю, значення генератора завжди будуть унікальні. До речі, саме тому, що зміни таблиць відбуваються всередині транзакцій, а з додатком може знадобитися дізнатися значення поля до того, як транзакція завершилася, настійно рекомендується замість простого присвоювання:
NEW.ID = GEN_ID (Gen_Tovar, 1);
робити це разом з перевіркою на NULL:
IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID (Gen_Tovar, 1);
Тепер ми можемо перевірити роботу нашого автоінкремента. Створіть наступний запит:
INSERT INTO Tovar (Nazvanie, Stoimost) VALUES ( 'Цукор', 10.50); INSERT INTO Tovar (Nazvanie, Stoimost) VALUES ( 'Крупа', 8.20); SELECT * FROM Tovar;
Якщо ви все зробили правильно, то в таблиці з'являться два записи, а поле ID буде автоматично збільшуватися на 1:
Мал. 20.4. Демонстрація роботи Автоінкрементний поля
Зверніть увагу на те, що ми вносили значення тільки в поля Nazvanie і Stoimost. Значення для поля ID генерувалися тригером автоматично. Не забудьте перед закриттям вікна Interactive SQL закрити транзакцію командою COMMIT.
На відміну від збережених процедур, для тригерів не передбачений розділ в дереві серверів утиліти IBConsole. Однак побачити наш тригер можна. Тригер створювався для таблиці Tovar. Виділіть її, натисніть праву кнопку миші і в контекстному меню виберіть команду Properties. Відкриється вікно властивостей таблиці, в якому слід перейти на вкладку Metadata. У цьому вікні, після опису створення таблиці, ви побачите опис нашого тригера TrTovar.
Лекція 21. Команди модифікації даних DML. Скрипти.
Команди модифікації даних відносяться до мови DML (Мова Маніпулювання Даними), який є підмножиною мови SQL. Значення можуть бути поміщені в таблицю, змінені або видалені наступними операторами:
UPDATE (Змінити) DELETE (Видалити)
У клієнтському додатку ми маємо можливість користуватися табличним компонентом Table, в якому ці дії можна виконувати за допомогою методів, однак це вдається не завжди. Наприклад, ми вставимо новий запис методом Append в таблицю, яка має автоінкрементне поле, що заповнюється тригером автоматично. Потім ми введемо всі значення, крім автоінкремента. Далі, при спробі виконати метод Post, який зберігає запис, ми, швидше за все, отримаємо помилку. Пов'язано це з тим, що тригер BEFORE INSERT спрацьовує після того, як табличний компонент виконає метод Post. А оскільки ключове поле має параметр NOT NULL, то InterBase не дасть нам вставити запис з незаповненим ключовим полем. Зате вставка запису запитом INSERT здійснюється без проблем. Тому редагування даних найчастіше перекладають на компонент Query, властивості SQL якого присвоєно потрібний запит. А значить, необхідно знати команди модифікації, і вміти їх застосовувати.