Müvəqqəti cədvəllər — bunlar yalnız cari sessiya və ya tranzaksiya müddətində mövcud olan cədvəllərdir. Sessiyan bitən kimi (və ya tranzaksiya bağlananda) müvəqqəti cədvəl və onun məlumatları qumda iz kimi yox olur. Onlar müvəqqəti məlumat saxlamaq, aralıq hesablamalar və ya mürəkkəb əməliyyatlar üçün məlumat hazırlamaq üçün idealdır.
Bəs bunlar niyə lazımdır?
- Müvəqqəti məlumat saxlama: Məsələn, səndə bir neçə mərhələdə aparılan mürəkkəb hesablamalar var. Əsas cədvəli yükləmək əvəzinə, müvəqqəti cədvəllərdən istifadə edə bilərsən.
- Məlumat analizi: Bir neçə mənbədən məlumat toplayıb, onları işləyib, analizdən sonra müvəqqəti cədvəli silə bilərsən.
- Mürəkkəb sorğuların optimallaşdırılması: Bəzən sorğunu bir neçə mərhələyə bölmək və müvəqqəti cədvəllərdən istifadə etmək daha sürətli olur.
- Risklərin minimallaşdırılması: Real cədvəlləri təsadüfən korlamaq riski yoxdur — müvəqqəti cədvəllər tam izolyasiya olunub.
Müvəqqəti cədvəllərin magiyası ondadır ki, onların məlumatları yalnız sənə görünür! Digər istifadəçilər bu cədvəllərə baxa bilməz, ona görə də müvəqqəti cədvəllər eksperimentlər üçün tam təhlükəsizdir.
Müvəqqəti cədvəllərin yaradılması
Müvəqqəti cədvəl yaratmaq adi cədvəl yaratmağa bənzəyir, sadəcə TEMP və ya TEMPORARY açar sözü əlavə olunur.
Sintaksis:
CREATE TEMP TABLE table_name (
column_name data_type constraints,
...
);
Çox sadədir, düzdür? Müvəqqəti cədvəl sessiyan bitəndə avtomatik yox olacaq.
Nümunə kimi tələbələr haqqında məlumat saxlamaq üçün müvəqqəti cədvəl yaradaq:
CREATE TEMP TABLE temp_students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER CHECK (age > 0)
);
İndi bizdə temp_students adlı müvəqqəti cədvəl var, ora məlumat əlavə edib, adi cədvəl kimi işləyə bilərik. Sadəcə unutma — sessiyanı bağlayanda o yox olacaq.
Sorğudan müvəqqəti cədvəl yaratmaq
Bəzən müvəqqəti cədvəlin strukturunu əl ilə yazmaq istəmirsən — xüsusən də sadəcə hansısa sorğunun nəticəsini saxlamaq və onunla işləmək istəyirsənsə. Bu halda belə bir forma köməyə gəlir:
CREATE TEMP TABLE cədvəl_adı AS
SELECT ...;
Bu konstruktor müvəqqəti cədvəli təkcə yaradır yox, dərhal sorğudan gələn məlumatlarla doldurur.
Tutaq ki, heç bir kursa yazılmamış tələbələri saxlamaq istəyirsən:
CREATE TEMP TABLE temp_unregistered_students AS
SELECT s.id, s.name
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id
WHERE e.student_id IS NULL;
İndi səndə temp_unregistered_students adlı cədvəl var və onu skriptin digər hissələrində istifadə edə bilərsən — sorğunu təkrar yazmağa ehtiyac yoxdur.
Bunun nə xeyri var?
- Sütunları və tipləri açıq göstərməyə ehtiyac yoxdur — PostgreSQL onları
SELECTnəticəsindən özü müəyyən edəcək. - Müvəqqəti məlumatları dəfələrlə istifadə edə bilərsən, təkrar hesablamaya ehtiyac yoxdur.
- Xüsusilə hesabatlarda, ETL əməliyyatlarında və analitikada çox faydalıdır.
Müvəqqəti cədvəllər tranzaksiyalarda
Müvəqqəti cədvəlləri tranzaksiya daxilində də yarada bilərsən. Bu halda onlar tranzaksiya bitən kimi avtomatik silinəcək. Bu, xüsusilə müvəqqəti məlumatların bazada qalmayacağına əmin olmaq istədiyin tapşırıqlarda faydalıdır. Tranzaksiyalar barədə daha ətraflı bir neçə səviyyə sonra danışacam — hələlik rahat ol, narahat olma :P
Nümunə:
BEGIN;
CREATE TEMP TABLE temp_transactions (
transaction_id SERIAL PRIMARY KEY,
amount NUMERIC(10, 2) NOT NULL,
status VARCHAR(50)
);
INSERT INTO temp_transactions (amount, status)
VALUES (100.50, 'Gözləmədə');
-- Məlumatlara baxaq
SELECT * FROM temp_transactions;
COMMIT;
-- İndi temp_transactions cədvəli yox oldu!
Əgər COMMIT əvəzinə ROLLBACK etsən, həm məlumatlar, həm də cədvəl silinəcək.
Müvəqqəti cədvəllərin real tapşırıqlarda istifadəsi
Nümunə 1: Məlumatların müvəqqəti birləşdirilməsi
Tutaq ki, səndə iki cədvəl var: students və courses. Tapşırıq — hansı tələbələrin hələ kurslara yazılmadığını tapmaqdır. Əvvəlcə məlumatları müvəqqəti cədvəldə toplayıb, sonra analiz edə bilərik.
CREATE TEMP TABLE temp_unregistered_students AS
SELECT s.id, s.name
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id
WHERE e.student_id IS NULL;
-- İndi temp_unregistered_students müvəqqəti cədvəli ilə işləyə bilərik.
SELECT * FROM temp_unregistered_students;
Nümunə 2: Hesabat üçün məlumatların hazırlanması
Bəzən bir neçə cədvəldən məlumat toplayıb, onları çevirmək və hesabat hazırlamaq lazımdır. Müvəqqəti cədvəllər bu iş üçün əladır.
CREATE TEMP TABLE temp_sales AS
SELECT p.product_id, p.name, SUM(s.quantity) AS total_quantity
FROM products p
JOIN sales s ON p.product_id = s.product_id
GROUP BY p.product_id, p.name;
-- Nəticəni müvəqqəti cədvəldə saxladıq. İndi onun əsasında hesabat qurmaq olar:
SELECT name, total_quantity FROM temp_sales WHERE total_quantity > 50;
Müvəqqəti cədvəllərin fəndləri və xüsusiyyətləri
Müvəqqəti cədvəllərin adlandırılması: Əgər səndə artıq students adlı adi cədvəl varsa, yenə də eyni adda müvəqqəti cədvəl yarada bilərsən! Müvəqqəti cədvəl sessiya daxilində üstünlük təşkil edəcək. Amma unutma, bu bəzən çaşdırıcı ola bilər.
Müvəqqəti cədvəllərin optimallaşdırılması: PostgreSQL PRIMARY KEY və ya UNIQUE məhdudiyyəti olan sütunlar üçün avtomatik indeks yaradır, hətta müvəqqəti cədvəllərdə də. Əgər məlumatlarla işi sürətləndirmək istəyirsənsə, özün də indeks əlavə edə bilərsən:
CREATE INDEX idx_temp_students_age ON temp_students (age);
Müvəqqəti cədvəlin silinməsi: Əgər müvəqqəti cədvəli sessiya bitmədən silmək istəyirsənsə, DROP TABLE əmri istifadə et:
DROP TABLE temp_students;
Müvəqqəti cədvəldə məlumat həcmi: Müvəqqəti cədvəllər yaddaşda saxlanılır (resurslar kifayət edirsə), bu da onları çox sürətli edir. Amma unutma, çox böyük məlumatlar artıq diskə yazıla bilər.
Tez-tez rast gəlinən səhvlər və onlardan necə qaçmaq olar
Səhv 1: "Cədvəl artıq mövcuddur"
Əgər eyni adda başqa bir müvəqqəti cədvəl varsa, yeni müvəqqəti cədvəl yaratmağa çalışsan, səhv alacaqsan. CREATE TEMP TABLE IF NOT EXISTS istifadə et və ya cədvəli yaratmazdan əvvəl sil:
DROP TABLE IF EXISTS temp_students;
CREATE TEMP TABLE temp_students (...);
Səhv 2: "Cədvəl çox tez yox olur"
Əgər müvəqqəti cədvəli tranzaksiya daxilində yaradırsansa, unutma ki, tranzaksiya bitəndə o da yox olacaq. Addımlarını əvvəlcədən planlaşdır!
GO TO FULL VERSION