68 / 100

SEQUENCE

Ketma-ketliklar

Kirish: Ushbu qo'llanmada siz PostgreSQL SEQUENCE (ketma-ketlik) obyektlari yordamida unikal butun sonlar ketma-ketligini hosil qilish va boshqarishni o'rganasiz.

PostgreSQL Ketma-ketliklariga kirish

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:

query.sql
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).

Ketma-ketlik funksiyalari

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.

O'suvchi ketma-ketlik yaratish misoli

1 dan boshlanib 1 tadan o'suvchi asc_seq ketma-ketligini yaratamiz:

query.sql
CREATE SEQUENCE asc_seq
START WITH 1 
INCREMENT BY 1;

Uni oldinga siljitish:

query.sql
SELECT nextval('asc_seq');
-- Natija: 1

SELECT nextval('asc_seq');
-- Natija: 2

Joriy qiymatini ko'rish:

query.sql
SELECT currval('asc_seq');
-- Natija: 2

Kamayuvchi ketma-ketlik misoli

Manfiy qadam bilan kamayuvchi ketma-ketlik:

query.sql
CREATE SEQUENCE desc_seq
INCREMENT BY -1;

SELECT nextval('desc_seq');
-- Natija: -1

SELECT nextval('desc_seq');
-- Natija: -2

Ketma-ketlikni jadval ustuniga bog'lash

  1. Dastlab transfer_order_items jadvalini yaratamiz:
query.sql
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)
);
  1. 10 dan boshlanib 10 tadan oshuvchi va shu ustunga tegishli bo'lgan ketma-ketlik tuzamiz:
query.sql
CREATE SEQUENCE item_no_seq 
START 10 
INCREMENT 10 
MINVALUE 10 
OWNED BY transfer_order_items.item_no;
  1. Ustunning standart qiymati qilib nextval('item_no_seq') ni o'rnatamiz:
query.sql
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:

query.sql
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:

matn
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 o'chirish: DROP SEQUENCE

Ketma-ketlikni bazadan o'chirib tashlash:

query.sql
DROP SEQUENCE IF EXISTS asc_seq;

Barcha ketma-ketliklar ro'yxatini ko'rish

Bazadagi barcha mavjud ketma-ketliklarni ko'rish uchun quyidagi tizimli so'rovdan foydalanasiz:

query.sql
SELECT * FROM pg_class
WHERE relkind = 'S';

Xulosa

  • SEQUENCE sonlarni avtomatik tartib bilan oshirish yoki kamaytirish uchun mustaqil baza obyektidir.
  • Yangi qiymat olish uchun nextval(), joriy qiymat uchun currval() funksiyalari ishlatiladi.
  • Ketma-ketliklarni jadvallarga bog'lash uchun OWNED BY va DEFAULT nextval(...) dan foydalaniladi.