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:
- Constraint-lərin pozulması (
NOT NULL,UNIQUE,FOREIGN KEY). - Məlumatı yeniləyərkən və ya silərkən sorğuda (
WHERE) şərtlərin olmaması. - 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.
GO TO FULL VERSION