CodeGym /Kurslar /SQL SELF /Məlumatların əlavə və yenilənməsi zamanı error-ların işlə...

Məlumatların əlavə və yenilənməsi zamanı error-ların işlənməsi

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

Gəlin, cədvələ yeni məlumat əlavə edəndə baş verən tipik error-lara baxaq.

Error 1: Mütləq sahəyə NULL əlavə etməyə cəhd

PostgreSQL database qaydalarına ciddi nəzarət edir. Error mənbəyi ola biləcək bəzi constraint-lərə baxaq:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL, -- Ad NULL ola bilməz
    age INT
);

-- Error: name sahəsi mütləq doldurulmalıdır
INSERT INTO students (name, age) VALUES (NULL, 20);

Nəticə: error null value in column "name" of relation "students" violates not-null constraint`.

Əlavə etdiyin məlumatlara diqqət elə. Ola bilsin, bu column əvvəllər NULL qəbul edirdi, amma indi mütləq doldurulmalıdır.

Error 2: Unikal sütunda təkrarlanan məlumat.

CREATE TABLE courses (
    course_id SERIAL PRIMARY KEY,
    course_name TEXT UNIQUE -- Kursun adı unikal olmalıdır
);

-- Birinci əlavə uğurludur
INSERT INTO courses (course_name) VALUES ('SQL Basics');

-- İkinci əlavə error verir
INSERT INTO courses (course_name) VALUES ('SQL Basics');

Nəticə: error duplicate key value violates unique constraint`.

Adətən bu sənin səhvin deyil, istifadəçi təsadüfən eyni əməliyyatı təkrar edir. Bu vəziyyətdə heç nə etmək lazım deyil.

Error 3: Xarici açar (referential integrity) pozuntusu.

CREATE TABLE enrollments (
    enrollment_id SERIAL PRIMARY KEY,
    student_id INT REFERENCES students(id), -- Bu ID-li student olmalıdır
    course_id INT REFERENCES courses(course_id)
);

-- Error: ID = 99 olan student yoxdur
INSERT INTO enrollments (student_id, course_id) VALUES (99, 1);

Nəticə: error insert or update on table "enrollments" violates foreign key constraint`.

Əslində error-un çıxması yaxşıdır. Database-in bütövlüyünün pozulmasından pis heç nə yoxdur. Yəqin ki, database-lə işləyən kodda səhv var, ya da hansısa məlumat köhnəlib. Hər halda, database öz bütövlüyünü qoruyursa — bu əladır.

PostgreSQL-də error-ların işlənməsi

Bəli, error-lar olur. Amma əsas məsələ onları görmək yox, düzgün işləməkdir.

Transaction-lar — məlumatı qorumaq üçün alət

Məlumatlarla işləyəndə tez-tez transaction-lardan istifadə edirik ki, məlumatlar ardıcıl və düzgün qalsın. Əgər error çıxsa, dəyişiklikləri geri qaytara bilərik.

Nümunə: iki cədvələ məlumat əlavə etmək.

BEGIN; -- Transaction-a start veririk

-- students cədvəlinə məlumat əlavə edirik
INSERT INTO students (name, age) VALUES ('Otto Lin', 21);

-- enrollments cədvəlinə qeyd əlavə edirik
-- Burada error çıxacaq, əgər ID=10 olan kurs yoxdursa
INSERT INTO enrollments (student_id, course_id) VALUES (1, 10);

-- Hər şey uğurlu olarsa
COMMIT;
-- Əgər error çıxsa, dəyişiklikləri geri qaytarırıq
ROLLBACK;

Əgər course_id = 10 olan kurs yoxdursa, students cədvəlinə əlavə də ləğv olunacaq.

Transaction-larda error-ların işlənməsi

PostgreSQL-də error-ları qabaqcadan proqnozlaşdırıb, birbaşa sorğuda EXCEPTION blokları ilə işləmək olar.

Nümunə: student əlavə edirik və onu kursa yazırıq. Əgər error çıxsa, error barədə log-a qeyd əlavə olunur.

DO $$
BEGIN
    -- Məlumat əlavə etməyə çalışırıq
    INSERT INTO students (name, age) VALUES ('Anna Song', 22);
    INSERT INTO enrollments (student_id, course_id) VALUES (2, 999); -- Error

    -- Hər şey uğurlu olarsa
    RAISE NOTICE 'Qeyd uğurla əlavə olundu!';
EXCEPTION
    WHEN foreign_key_violation THEN
        -- Xarici açar pozuntusunu işləyirik
        RAISE WARNING 'Göstərilən course_id ilə kurs mövcud deyil.';
END $$;

ON CONFLICT ilə unikallığın yoxlanması

UNIQUE constraint pozuntusu ilə bağlı error-un qarşısını qabaqcadan almaq üçün ON CONFLICT konstruksiyasından istifadə edə bilərsən. Bu, konflikt zamanı nə etmək lazım olduğunu göstərməyə imkan verir.

Nümunə: təkrarlanan kurs əlavə olunanda əlavə etməni ötürürük.

INSERT INTO courses (course_name)
    VALUES ('SQL Basics')
ON CONFLICT (course_name) DO NOTHING; -- Təkrarlanan məlumatı ötür

Və ya mövcud sətri yeniləyirik:

INSERT INTO courses (course_name)
    VALUES ('SQL Basics')
ON CONFLICT (course_name) DO UPDATE     
    SET course_name = EXCLUDED.course_name || ' (Updated)';

ON CONFLICT operatoru barədə daha ətraflı növbəti səviyyədə danışacam, kütləvi məlumat yükləməsini keçəndə :P

Məlumatlarla işləyərkən tipik error-lar və onların qarşısının alınması

Artıq gördün ki, əsas error mənbələri bunlardır:

  1. Constraint-lərin pozulması (NOT NULL, UNIQUE, FOREIGN KEY).
  2. Məlumatı yeniləyərkən və ya silərkən sorğuda (WHERE) şərtlərin olmaması.
  3. Transaction-ların icra ardıcıllığında səhvlər.

Özünü qorumaq üçün:

  • Böyük əməliyyatlar üçün transaction və ROLLBACK-dan istifadə et.
  • Əlavə etməzdən əvvəl məlumatı həmişə yoxla.
  • Error-ları log-da qeyd et, analiz üçün.
  • Təkrarlanan sətrlərin qarşısını almaq üçün ON CONFLICT-dan istifadə et.

İndi error-larla mübarizə üçün silahlanmısan! Unutma: yaxşı developer səhv etməyən deyil, səhvləri düzəldə biləndir.

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