Ketma-ketliklar
Kirish: Ushbu qo'llanmada siz PostgreSQL SEQUENCE (ketma-ketlik) obyektlari yordamida unikal butun sonlar ketma-ketligini hosil qilish va boshqarishni o'rganasiz.
PostgreSQLda ketma-ketlik (SEQUENCE) — bu berilgan parametrlar asosida avtomatik ravishda unikal butun sonlar ketma-ketligini ishlab chiqaruvchi maxsus ma'lumotlar bazasi obyektidir.
Yangi ketma-ketlik yaratish sintaksisi:
CREATE SEQUENCE sequence_name
[START WITH start_value]
[INCREMENT BY increment_value]
[MINVALUE min_value | NO MINVALUE]
[MAXVALUE max_value | NO MAXVALUE]
[CYCLE | NO CYCLE]
[CACHE cache_value | NO CACHE]
[OWNED BY table_name.column_name];
Asosiy parametrlar:
START WITH start_value — ketma-ketlik qaysi sondan boshlanishi (sukut bo'yicha 1).INCREMENT BY increment_value — har bir qadamda qanchaga o'zgarishi (sukut bo'yicha 1; manfiy son bo'lsa kamayib boradi).OWNED BY table_name.column_name — ketma-ketlikni muayyan jadval ustuniga bog'laydi (jadval yoki ustun o'chirilganda ketma-ketlik ham birga o'chadi).PostgreSQL ketma-ketliklar bilan ishlash uchun quyidagi o'rnatilgan funksiyalarni taqdim etadi:
nextval('seq_name') — ketma-ketlikni bitta qadam oldinga siljitadi va yangi hosil bo'lgan qiymatni qaytaradi.currval('seq_name') — joriy sessiyada oxirgi marta nextval() qaytargan qiymatni ko'rsatadi.setval('seq_name', value) — ketma-ketlikning joriy sonini qo'lda o'rnatadi.lastval() — joriy sessiyada ixtiyoriy ketma-ketlik tomonidan hosil qilingan eng so'nggi qiymatni qaytaradi.1 dan boshlanib 1 tadan o'suvchi asc_seq ketma-ketligini yaratamiz:
CREATE SEQUENCE asc_seq
START WITH 1
INCREMENT BY 1;
Uni oldinga siljitish:
SELECT nextval('asc_seq');
-- Natija: 1
SELECT nextval('asc_seq');
-- Natija: 2
Joriy qiymatini ko'rish:
SELECT currval('asc_seq');
-- Natija: 2
Manfiy qadam bilan kamayuvchi ketma-ketlik:
CREATE SEQUENCE desc_seq
INCREMENT BY -1;
SELECT nextval('desc_seq');
-- Natija: -1
SELECT nextval('desc_seq');
-- Natija: -2
transfer_order_items jadvalini yaratamiz:CREATE TABLE transfer_order_items (
order_no INT,
item_no INT,
product_id INT NOT NULL,
quantity INT NOT NULL,
from_bin VARCHAR(20) NOT NULL,
to_bin VARCHAR(20) NOT NULL,
PRIMARY KEY (order_no, item_no)
);
CREATE SEQUENCE item_no_seq
START 10
INCREMENT 10
MINVALUE 10
OWNED BY transfer_order_items.item_no;
nextval('item_no_seq') ni o'rnatamiz:ALTER TABLE transfer_order_items
ALTER COLUMN item_no
SET DEFAULT nextval('item_no_seq');
Endi har safar yangi qator kiritilganda item_no avtomatik ravishda 10, 20, 30 ko'rinishida to'lib boradi:
INSERT INTO
transfer_order_items (order_no, product_id, quantity, from_bin, to_bin)
VALUES
(1, 1, 5, 'A-01', 'B-01'),
(1, 2, 10, 'A-01', 'B-01')
RETURNING *;
Natija:
order_no | item_no | product_id | quantity | from_bin | to_bin
----------+---------+------------+----------+----------+--------
1 | 10 | 1 | 5 | A-01 | B-01
1 | 20 | 2 | 10 | A-01 | B-01
Ketma-ketlikni bazadan o'chirib tashlash:
DROP SEQUENCE IF EXISTS asc_seq;
Bazadagi barcha mavjud ketma-ketliklarni ko'rish uchun quyidagi tizimli so'rovdan foydalanasiz:
SELECT * FROM pg_class
WHERE relkind = 'S';
SEQUENCE sonlarni avtomatik tartib bilan oshirish yoki kamaytirish uchun mustaqil baza obyektidir.nextval(), joriy qiymat uchun currval() funksiyalari ishlatiladi.OWNED BY va DEFAULT nextval(...) dan foydalaniladi.