CodeGym /Kurslar /SQL SELF /Cədvəllər yaradılarkən xarici açarların yaradılması

Cədvəllər yaradılarkən xarici açarların yaradılması

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

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?

  1. 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.
  2. 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: studentscourses 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:

  • students cədvəlində hər tələbəni identifikasiya etmək üçün PRIMARY KEY yaratdıq.
  • courses cədvəlində student_id sütunu FOREIGN KEY kimi çıxış edir və students cədvəlindəki student_id sü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, coursesenrollments 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 studentscourses cədvəllərini student_idcourse_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 DELETEON 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 DELETEON 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 NULL olur.
  • 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ə RESTRICT kimidir, 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 CASCADE yoxdursa), 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

  1. 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.
  2. 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.
  3. ON DELETE və ya ON UPDATE modifikatoru 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 CASCADEON 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.

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