CodeGym /Kurslar /SQL SELF /Məlumatların silinməsi DELETE ilə

Məlumatların silinməsi DELETE ilə

SQL SELF
Səviyyə , Dərs
Mövcuddur

Silinmə — sadəcə funksiya deyil, bu bir sənətdir! Əsas odur ki, lazım olanı siləsən, artıq heç nə toxunmayasan (təsadüfən silinən məlumatlar səni gecələr kabus kimi izləyə bilər). Bu gün biz bunu necə səliqəli və qaydalara uyğun etmək lazım olduğunu öyrənəcəyik!

Məlumatların silinməsi — bu, cədvəldən bir və ya bir neçə sətrin çıxarılması prosesidir, hansı ki, artıq biznes loqikasına və ya sisteminin tələblərinə uyğun gəlmir. Məsələn, sənə lazım ola bilər ki, təhsili bitirmiş və ya ciddi şəkildə, hmm, universitet qaydalarını pozmuş tələbələrin qeydlərini siləsən. Və ya, məsələn, cədvəldəki məlumatları təmizləyib yalnız aktual informasiyanı saxlamalısan.

Məlumatların silinməsi aşağıdakı ssenarilərdə istifadə olunur:

  • Artıq aktiv olmayan istifadəçilər haqqında məlumatların silinməsi.
  • Cədvəllərdən müvəqqəti qeydlərin təmizlənməsi.
  • Məlumatların dublikatlarının silinməsi.
  • Müəyyən biznes loqikasına əsasən köhnəlmiş qeydlərin silinməsi.

DELETE komandasının sintaksisi

Məlumatları silmək üçün biz DELETE komandasından istifadə edirik. Onun əsas sintaksisi belədir:

DELETE FROM cedvel
WHERE sert;

Əsas hissələr:

  • DELETE FROM — cədvəldən sətrlərin silinməsini göstərən əsas ifadə.
  • cedvel — hansı cədvəldən məlumatların silinəcəyinin adı.
  • WHERE sert — hansı sətrlərin silinəcəyini filtr edən şərt. Burada istənilən müqayisə operatorlarından, məntiqi operatorlardan (AND, OR, NOT) və hətta subquery-lərdən istifadə edə bilərsən.

Nümunə: təsəvvür elə ki, bizdə students cədvəli var və biz oradan ID = 5 olan tələbəni silmək istəyirik:

DELETE FROM students
WHERE id = 5;

Bu sorğu students cədvəlindən tələbənin identifikatoru (id sütunu) 5 olan sətri siləcək.

Diqqət: əgər sən WHERE şərtini unutsaq, PostgreSQL bütün sətrləri cədvəldən siləcək. Belə bir səhv, xüsusilə production sistemində, fəlakət ola bilər.

Cədvəldəki bütün sətrlərin silinməsi

Əgər sənə cədvəldəki bütün sətrləri silmək lazımdırsa, WHERE şərti olmadan sorğunu birbaşa yaza bilərsən. Məsələn:

DELETE FROM students;

Bu sorğu bütün qeydləri students cədvəlindən siləcək. Amma cədvəlin strukturu qalacaq — sadəcə boş olacaq.

Alternativ: TRUNCATE

Cədvəldəki bütün sətrləri silmək üçün TRUNCATE komandasından da istifadə edə bilərsən. O, DELETE-dən daha sürətli işləyir, çünki hər sətrin silinməsini transaction jurnalında qeyd etmir. Nümunə:

TRUNCATE TABLE students;

DELETETRUNCATE fərqləri:

  • DELETE hər silinməni transaction jurnalında qeyd edir, bu da lazım gəldikdə onları geri qaytarmağa imkan verir.
  • TRUNCATE şərtləri (WHERE) dəstəkləmir və silinməni tək-tək qeyd etmir, bu da onu daha sürətli, amma daha az çevik edir.

Əgər sən sadəcə cədvəli təmizləmək istəyirsənsə, TRUNCATE əla seçimdir. Amma əgər yalnız bir hissə məlumatı silmək və ya dəyişiklikləri geri qaytarmaq vacibdirsə, DELETE daha yaxşıdır.

Mürəkkəb şərtlərlə məlumatların silinməsi

DELETE-də silinmə şərtləri sadə yox, həm də mürəkkəb ola bilər, yəni məntiqi operatorlar (AND, OR, NOT) və ya hətta subquery-lər də istifadə oluna bilər. Gəlin nümunəyə baxaq.

Nümunə 1: Bir neçə qeydin silinməsi 30 yaşdan böyük və son 3 ayda dərsə gəlməyən bütün tələbələri silirik:

DELETE FROM students
WHERE age > 30 AND last_attendance_date < (CURRENT_DATE - INTERVAL '3 months');

Bu sorğu yalnız hər iki şərtə uyğun gələn tələbələri siləcək.

Nümunə 2: Subquery ilə silinmə

Tutaq ki, bizdə failed_students cədvəli var, burada akademik uğursuzluğa görə xaric olunan tələbələrin identifikatorları saxlanılır. Biz onları əsas students cədvəlindən silməliyik:

DELETE FROM students
WHERE id IN (SELECT student_id FROM failed_students);

Burada subquery failed_students cədvəlindən bütün tələbə identifikatorlarını qaytarır və DELETE komandası uyğun sətrləri students cədvəlindən silir.

Tövsiyə

Nə isə silməzdən əvvəl, silmək istədiyin məlumatları göstərən SELECT yaz. Sonra sadəcə SELECT hissəsini DELETE ilə əvəz elə və o, elə həmin sətrləri siləcək.

Praktiki tətbiq nümunəsi

Təsəvvür elə ki, ID = 7 olan tələbə universiteti dəyişmək qərarına gəlib. Onun haqqında bütün məlumatları cədvəldən silirik:

DELETE FROM students
WHERE id = 7;

Komandanı icra etdikdən sonra cədvəli yoxla ki, həqiqətən qeyd silinib:

SELECT * FROM students WHERE id = 7;

Əgər ID = 7 olan qeyd artıq yoxdursa, silinmə uğurla başa çatıb.

Xəbərdarlıqlar və tipik səhvlər

Unudulmuş WHERE bölməsi

DELETE ilə işləyərkən ən çox rast gəlinən səhvlərdən biri WHERE bölməsinin unudulmasıdır. Bu, cədvəldəki bütün sətrlərin silinməsinə səbəb olur və bu, həqiqətən fəlakət ola bilər. Həmişə sorğularını icra etməzdən əvvəl yoxla.

Unutqanlıqdan yaranan vəziyyətin nümunəsi:

DELETE FROM students;
-- Səhv! Bütün tələbələr silinir.

Belə səhvlərdən qaçmaq üçün DELETE komandasını icra etməzdən əvvəl həmişə WHERE şərtini SELECT ilə yoxlamaq tövsiyə olunur. Məsələn:

SELECT * FROM students WHERE id = 5;

Əgər nəticə səni qane edirsə, onda rahatlıqla DELETE işlədə bilərsən.

Əlaqəli məlumatların silinməsi

Əgər cədvəldə xarici açarlar (FOREIGN KEY) varsa, məlumatların silinməsi zamanı səhv çıxa bilər. Bu, silinən sətrin başqa qeydlərlə əlaqəsi olduqda baş verir. Məsələn, əgər tələbə enrollments cədvəlində kursa yazılıbsa, PostgreSQL onu students cədvəlindən silməyə imkan verməyəcək.

Bu problemi həll etmək üçün:

  1. Xarici açar yaradanda ON DELETE CASCADE istifadə et.
  2. Əsas cədvəldən silməzdən əvvəl əlaqəli qeydləri əl ilə sil.

Əlaqəli məlumatların əl ilə silinməsi nümunəsi:

-- əvvəlcə tələbə 5 haqqında məlumatı enrollments cədvəlindən silirik
DELETE FROM enrollments
WHERE student_id = 5;

-- sonra tələbənin özünü silirik
DELETE FROM students
WHERE id = 5;

Transaksiyalarla silinmə

Çox vacib silinmə əməliyyatlarında transaksiyalardan istifadə etmək məsləhətdir. Bu, səhv olduqda dəyişiklikləri geri qaytarmağa imkan verir.

Transaksiyada silinmə nümunəsi:

BEGIN;

DELETE FROM students
WHERE id = 42;

-- Nəticəni yoxlayırıq
SELECT * FROM students WHERE id = 42;

-- Hər şey qaydasındadırsa, dəyişiklikləri təsdiqləyirik
COMMIT;

-- Əks halda, geri qaytarırıq
-- ROLLBACK;

Transaksiyalar haqqında daha ətraflı növbəti leksiyalarda :P

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION