Kursumuzun əsas leksiyalarından birinə xoş gəlmisən! Bu gün PostgreSQL-də xarici açarların necə yaradıldığından danışacağıq. Bu mövzu database dizaynında çox vacibdir, çünki məhz xarici açarlar cədvəllər arasında əlaqə qurmağa imkan verir. Əgər hiss edirsənsə ki, gələcək "SQL-şəhərində" azacaqsan, xarici açarları fərqli rayonları birləşdirən körpülər kimi təsəvvür et.
Sadə dillə desək, xarici açar — bir cədvəldə olan sütun (və ya sütunlar toplusu) başqa bir cədvəldəki sütuna (adətən primary key) istinad edir.
Məsələn, əgər səndə iki cədvəl var — students (tələbələr) və courses (kurslar), o zaman courses cədvəlindəki xarici açar kursun hansı tələbəyə aid olduğunu "göstərə" bilər. Beləliklə, bu cədvəllər arasında əlaqə yaranır.
Niyə bu vacibdir?
- Xarici açar məlumatların bütövlüyünü təmin etməyə kömək edir: başqa cədvəldə olmayan bir şeyi bir cədvələ yazmaq mümkün deyil.
- Onlar məlumatlarla işləməyi asanlaşdırır. Məsələn, bir cədvəldəki yazını siləndə digər cədvəldə əlaqəli yazıların avtomatik silinməsini qura bilərik.
Xarici açarın yaradılması üçün sintaksis
PostgreSQL-də xarici açar yaratmaq asandır — bir az SQL-magic kifayətdir. Budur əsas sintaksis:
CREATE TABLE asılı_cədvəl (
kolonka_foreign_id DATA_TYPE REFERENCES valideyn_cədvəl(kolonka_id)
);
Gəlin nüanslara daha dərindən baxaq və bir neçə nümunə ilə izah edək.
Nümunə 1: students və courses cədvəlləri
Təsəvvür et ki, tələbələrlə kurslar arasında əlaqə yaratmaq istəyirik. Hər kurs hansısa tələbə ilə əlaqəli olmalıdır. Bunun üçün sadəcə aşağıdakı sorğunu icra etmək kifayətdir:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
student_id INT REFERENCES students(student_id)
);
Burada:
studentscədvəlində hər tələbəni identifikasiya etmək üçünPRIMARY KEYyaratdıq.coursescədvəlindəstudent_idsütunuFOREIGN KEYkimi çıxış edir vəstudentscədvəlindəkistudent_idsütununa istinad edir.
students cədvəli
| student_id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
courses cədvəli
| course_id | title | student_id - FOREIGN KEY |
|---|---|---|
| 1 | SQL Basics | 1 |
| 2 | Algorithms | 1 |
| 3 | Data Structures | 2 |
| 4 | Intro to Python | 3 |
Vacib qeyd
Xarici açar əlavə etdikdə, PostgreSQL avtomatik olaraq qayda yaradır ki, xarici açardakı dəyərlər göstərilən cədvəldəki mövcud dəyərlərlə üst-üstə düşsün. Əgər səhv dəyər daxil etməyə çalışsan, database error verəcək.
Praktik tətbiq: students, courses və enrollments modeli
Gəlin bir az daha çətin "çoxdan-çoxa" əlaqə nümunəsinə baxaq. Eyni tələbə bir neçə kursa yazıla bilər, bir kursu isə bir neçə tələbə seçə bilər. Belə əlaqə üçün aralıq cədvəl lazımdır.
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
title TEXT NOT NULL
);
CREATE TABLE enrollments (
enrollment_id SERIAL PRIMARY KEY,
student_id INT REFERENCES students(student_id), -- xarici açar
course_id INT REFERENCES courses(course_id) -- xarici açar
);
Burada enrollments cədvəli students və courses cədvəllərini student_id və course_id xarici açarları ilə birləşdirir.
Data əlavə etmək
-- Tələbələri əlavə edirik
INSERT INTO students (name) VALUES ('İvan İvanov'), ('Mariya Smirnova');
-- Kursları əlavə edirik
INSERT INTO courses (title) VALUES ('Riyaziyyat'), ('Fizika');
-- Tələbələri kurslara yazırıq
INSERT INTO enrollments (student_id, course_id) VALUES (1, 1), (1, 2), (2, 1);
Data seçmək
İndi rahatlıqla sorğular edə bilərik ki, hansı tələbə hansı kurslara gedir və ya hansı kursda hansı tələbələr var:
-- İvan İvanov-un yazıldığı kurslar
SELECT c.title
FROM enrollments e
JOIN courses c ON e.course_id = c.course_id
WHERE e.student_id = 1;
-- "Riyaziyyat" kursuna yazılan tələbələr
SELECT s.name
FROM enrollments e
JOIN students s ON e.student_id = s.student_id
WHERE e.course_id = 1;
Əlavə imkanlar: ON DELETE və ON UPDATE
Xarici açar həm də valideyn cədvəldə yazılar dəyişəndə və ya silinəndə nə baş verəcəyini idarə etməlidir. Bunun üçün ON DELETE və ON UPDATE modifikatorlarından istifadə olunur. Əsas variantlar bunlardır:
- CASCADE: valideyn cədvəldə dəyişiklik və ya silinmə avtomatik olaraq övlad yazılara tətbiq olunur.
- SET NULL: övlad cədvəldə xarici açar dəyərləri
NULLolur. - RESTRICT: əgər məlumat artıq asılı cədvəldə istifadə olunursa, silmək və ya dəyişmək qadağandır.
- NO ACTION: əslində
RESTRICTkimidir, sadəcə yoxlama bir az gec aparılır.
Nümunə 2: ON DELETE CASCADE tətbiqi
Təsəvvür et ki, istəyirik ki, students cədvəlindən tələbə silinəndə, həmin tələbənin courses cədvəlindəki bütün kursları da avtomatik silinsin. Bunu belə edirik:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
student_id INT REFERENCES students(student_id) ON DELETE CASCADE
);
İndi əgər students cədvəlindən tələbə silsən, həmin tələbə ilə əlaqəli olan bütün kurslar courses cədvəlindən də silinəcək. Məsələn:
INSERT INTO students (name) VALUES ('İvan İvanov');
INSERT INTO courses (title, student_id) VALUES ('Riyaziyyat', 1), ('Fizika', 1);
-- İvanov tələbəsini silirik
DELETE FROM students WHERE student_id = 1;
-- courses cədvəli indi boş olacaq, çünki İvanovla əlaqəli bütün kurslar silindi
Bu mövzunu növbəti leksiyada daha ətraflı izah edəcəyik.
Xarici açarlardan istifadə zamanı məlumatların yoxlanılması prosesi
Xarici açar yaradanda, PostgreSQL ciddi bir "nəzarətçi" kimi hər yeni yazını yoxlayır. Məsələn:
- Əgər mövcud olmayan xarici açar dəyəri ilə yazı əlavə etməyə çalışsan, error alacaqsan.
- Əgər valideyn cədvəldə əlaqəli yazını silirsənsə (və
ON DELETE CASCADEyoxdursa), bu, məlumatların bütövlüyünün pozulmasına səbəb olacaq.
Nümunə: səhv data əlavə etmək cəhdi
-- Mövcud olmayan tələbəyə kurs yazmaq cəhdi
INSERT INTO enrollments (student_id, course_id) VALUES (3, 1);
-- Error: xarici açar məhdudiyyətinin pozulması
Xarici açar yaradarkən tipik səhvlər
- Xarici açarda index-in olmaması. PostgreSQL primary key üçün avtomatik index yaradır, amma xarici açar üçün yox. Əgər xarici açarı tez-tez
WHEREşərtində istifadə edəcəksənsə, index-i əl ilə yaratmaq yaxşıdır. - Cədvəllərin yaradılma ardıcıllığı səhvdir. Hələ mövcud olmayan cədvələ istinad edən xarici açar yaratmaq mümkün deyil.
ON DELETEvə yaON UPDATEmodifikatoru unudulub. Bu, məlumatları redaktə edəndə gözlənilməz nəticələrə səbəb ola bilər.
Artıq xarici açarların necə yaradıldığını bilirsən və bu, sənə strukturlaşdırılmış və uyğun database-lər qurmaq üçün güclü alət verir. Növbəti leksiyada ON DELETE CASCADE və ON UPDATE RESTRICT əməliyyatlarını daha ətraflı izah edəcəyik və əlaqəli məlumatların idarə olunmasını göstərəcəyik.
GO TO FULL VERSION