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

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
PAGE 3
5 Послідовності
PostgreSQL є обєктно-реляційною СУБД, що дозволило включити в неї ряд нестандартних розширень SQL. Частинацих розширень повязана з автоматизацією часто вживаних операцій з базами даних, це, зокрема, послідовності і тригери.
Послідовність (sequence) являє собою послідовність чисел. Значення послідовності мають тип integer, тому її значення повинні лежати в межах від 2 147 483 647 до -2 147 483 647. Як правило, її використовують у обмеженні DEFAULT для надання унікальних значень полям таблиць. Ці значення автоматично змінюються шляхом виклику функції nextval(). У інших СУБД, наприклад MS Access, послідовності називають лічильниками.
Послідовність створюється командою:
CREATE SEQUENCE послідовність
[ INCREMENT приріст] [ MINVALUE мінімум ] [ MAXVALUE максимум ] [ START початок ]
[ CACHE кеш ] [ CYCLE ]
Тут:
У нижченаведеному прикладі створюється послідовність з імям ship, яка починається із значення 0 і збільшується на 1 до тих пір, поки не досягне максимального значення. Ключове слово CYCLE не вказане, тому ця послідовністьнабуває лише унікальних значень.
CREATE SEQUENCE ship MINVALUE 0;
До послідовності також можна звернутисякомандою SELECT, як до таблиці, хоча така можливість використовується відносно рідко, наприклад, під час випробування або перевірки послідовності. При складанні запиту до послідовності в списку вибірки вказуються їїатрибути, перелічені в таблиці. 5.1.
Таблиця 5.1. Атрибути послідовності
Атрибут |
Тип |
Примітка |
sequence_name |
name |
Імя послідовності |
last_value |
integer |
Поточне значення |
increment_by |
integer |
Нарощення |
max_value |
integer |
Максимальне значення |
min_value |
integer |
Мінімальне значення |
cache_value |
integer |
Обєм кеша, байт |
log_cnt |
integer |
|
is_cycled |
"char" |
|
is_called |
"char" |
Нижче показано запит до послідовності ship. Він повертає атрибути last_value (поточне значення, оскільки послідовність щойно створена, то воно мінімально задане і дорівнює 0) та increment_by (приріст, за замовчуванням дорівнює 1).
SELECT last_value, increment_by FROM ship;
Як правило, всі операції з послідовностями виконуються за допомогою таких трьох спеціальних функцій PostgreSQL
Нижче в прикладі виводиться пара чергових значень послідовності ship.
SELECT nextval('ship');
nextval
---------
1
SELECT nextval('ship');
nextval
---------
2
Як бачимо, при першому виклику функція nextval() повернула початкове (задане ключовим словом START) значення послідовності, коли приріст ще не відбувся. При всіх подальших викликах nextval() атрибут last_value змінюється.
Послідовності найчастіше використовуються для задавання значень за замовчуванням у полях таблиць. Нехай таблицю pidpr створено командою:
CREATE TABLE pidpr(
kod_p integer PRIMARY KEY DEFAULT nextval('ship'),
naz_p character(50),
misto character(30)
);
Тут поле kod_p має обмеження DEFAULT, функція nextval('ship') якого буде надавати кожного разу нарощені на одиницю значення за замовчуванням, вироблені послідовністю ship. Це поле має також обмеження PRIMARY KEY, яке, нагадаємо, означає ще й обмеження UNIQUE, тому в нього неможливо буде помилково занести неунікальні значення.
Тепер команда вставки даних у таблицю pidpr може виглядати, наприклад, так:
INSERT INTO pidpr(naz_p, misto) VALUES('Уренгой Помари Ужгород', 'Полтава');
Під час виконання команди код підпримства kod_p буде занесений у таблицю автоматично.
Змінити поточне значення послідовності дозволяє функція setval(), нижче показано, що значення послідовності ship змінюється на 1010, а далі нарощується на 1, тому дорівнює 1011:
SELECT setval('ship', 1010);
setval
--------
1010
SELECT nextval('ship');
nextval
---------
1011
Видаленняпослідовності забезпечує команда SQL DROP SEQUENCE, вона видаляє одну або декілька послідовностей одночасно. Ця команда має такий вигляд:
DROP SEQUENCE перелік_послідовностей
Приклад видалення послідовності ship:
DROP SEQUENCE ship;
Перш ніж знищувати послідовність, слід переконатися в тому, що вона не використовуєтьсяіншою таблицею, функцією або іншим обєктом бази даних. Якщо забути про цю перевірку, то можна порушити роботу інших операцій, залежних від даної послідовності. Вивести імена всіх таблиць, в яких використовується задана послідовність можна за допомогою такого запиту:
SELECT p.relname, a.adsrc FROM pg_class p
JOIN pg_attrdef a ON (p.relfilenode = a.adrelid)
WHERE a.adsrc ~ '"sequence_name "';
Приклад пошуку імен таблиць, уякихвикористовується послідовність ship.
SELECT p.relname, a.adsrc FROM pg_class p JOIN pg_attrdef a
ON (p.relfilenode = a.adrelid)
WHERE a.adsrc ~ '"ship"';
relname | adsrc
-----------+------------------------------------------
shipments | nextval('"shipments_ship_id_seq"'::text)