CodeGym /Kurslar /SQL SELF /CHECK məhdudiyyəti ilə CHECK v...

CHECK məhdudiyyəti ilə CHECK vasitəsilə məlumatların yoxlanılması

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

CHECK məhdudiyyəti — bir növ cədvəlinin girişində duran mühafizəçidir. O, təmin edir ki, cədvələ əlavə etdiyin məlumatlar müəyyən şərtlərə cavab versin. Əgər cədvələ elə məlumat ötürsən ki, bu şərtləri pozur, verilənlər bazası belə məlumatları qəbul etməyəcək.

Təsəvvür elə ki, Almaniyada mağaza açmaq istəyirsən. Amma qanuna görə bazar günü — istirahət günüdür və bu gün ticarət qadağandır. Bu məhdudiyyət — verilənlər bazasında CHECK analoqudur. Sən mağazanın iş qrafikini göstərmək istəyirsən: həftənin 7 günü açıq, amma sistem dərhal cavab verir: "Nein, nein, bazar günü — bu pozuntudur. Belə qrafik yoxlamadan keçməyəcək!"

Verilənlər bazasında da belədir: əgər CHECK qaydasını pozan bir dəyər təyin etsən, sistem onu bloklayır ki, "məntiqi səhv" yaranmasın.

Niyə CHECK lazımdır?

  1. Məlumat keyfiyyətinin qorunması: CHECK cədvələ səhv və ya məntiqə uyğun olmayan məlumatların düşməsinin qarşısını alır.
  2. Səhv ehtimalının azaldılması: məlumatları əlavə etməzdən əvvəl əl ilə yoxlamaq əvəzinə, bu işi verilənlər bazasına həvalə edə bilərsən.
  3. Məntiqin avtonomluğu: yoxlama qaydalarını verilənlər bazasının strukturuna daxil etmək olar, bunu tətbiq səviyyəsində kodda etmək lazım deyil.

CHECK necə işləyir?

CHECK məhdudiyyəti cədvəl yaradılan zaman təyin olunur və ya sonradan ALTER TABLE komandası ilə əlavə oluna bilər. Əsas sintaksis belədir:

CREATE TABLE cedvel (
    kolonka tip_datalar CHECK (sert)
);

sert — bu, göstərilən sütundakı hər bir dəyər üçün yerinə yetirilməli olan məntiqi ifadədir. Əgər şərt pozulursa, verilənlər bazası səhv verir.

Nümunə 1: Dəyərlərin diapazonunun yoxlanılması

Gəlin students cədvəli yaradaq, burada tələbələrin yaşı (age) 16-dan 100-ə qədər olmalıdır:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER CHECK (age >= 16 AND age <= 100)
);

İndi əgər sən 12 yaşında tələbə əlavə etməyə çalışsan, verilənlər bazası səni "əldə tutacaq":

INSERT INTO students (name, age)
VALUES ('Maria Chi', 12);

Səhv:

ERROR:  new row for relation "students" violates check constraint "students_age_check"
DETAIL:  Failing row contains (1, Maria Chi, 12).

Bəli, verilənlər bazası burada — sərt qapıçıdı. 16 yoxdursa — yaxınlaşma.

Nümunə 2: Məlumat formatının yoxlanılması

Tutaq ki, bizdə emails cədvəli var, burada email ünvanları saxlanılır. İstəyirik əmin olaq ki, ünvanlarda @ simvolu var (bu, sadələşdirilmiş yoxlamadır):

CREATE TABLE emails (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) CHECK (email LIKE '%@%')
);

Gəlin şərtə uyğun olmayan səhv ünvan əlavə etməyə çalışaq:

INSERT INTO emails (email)
VALUES ('notanemail.com');

Səhv:

ERROR:  new row for relation "emails" violates check constraint "emails_email_check"
DETAIL:  Failing row contains (1, notanemail.com).

Əgər bütün məlumatlarda @ simvolu varsa, səhvdən qaçmaq olar:

INSERT INTO emails (email) 
VALUES ('example@student.com');

Sorgu uğurla icra olunacaq.

Nümunə 3: Bir neçə sütun üçün şərtlərin yoxlanılması

CHECK məhdudiyyətləri təkcə bir sütunu yox, bir neçə sütuna bağlı məntiqi ifadəni də yoxlaya bilər. Gəlin employees cədvəli nümunəsinə baxaq, burada əmək haqqı (salary) bonusdan (bonus) çox olmalıdır:

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    salary NUMERIC CHECK (salary > 0),
    bonus NUMERIC CHECK (bonus >= 0),
    CHECK (salary > bonus)
);

İndi kimsə bonusu əmək haqqından çox olan işçi əlavə etməyə çalışsa, verilənlər bazası buna icazə verməyəcək:

INSERT INTO employees (name, salary, bonus)
VALUES ('Otto Lin', 3000, 4000);

Səhv:

ERROR:  new row for relation "employees" violates check constraint "employees_salary_bonus_check"
DETAIL:  Failing row contains (1, Otto Lin, 3000, 4000).

Praktiki tətbiq

CHECK məhdudiyyəti o hallarda kömək edir ki, biznes-məntiqin məlumatlara qoyulan məhdudiyyətlərlə sıx bağlıdır. Məsələn:

  1. Online mağazalar: mənfi qiymətli məhsulların əlavə olunmasının qadağan edilməsi.
  2. Təhsil platformaları: kurs iştirakçılarının yaşının yoxlanılması.
  3. Tibbi sistemlər: xəstənin bədən temperaturunun icazə verilən həddə olmasına əminlik.

Bu yoxlamalar — sadəcə əlavə təhlükəsizlik qatıdır, həm də developer və istifadəçilərin vaxtını və əsəblərini qoruyur.

Xüsusiyyətlər və tipik səhvlər

CHECK ilə işləyəndə aşağıdakı məqamları nəzərə al:

  • CHECK içindəki məntiqi ifadələr cədvəldəki bütün sətrlər üçün doğru olmalıdır. Əgər heç olmasa bir sətr qaydanı pozursa, məhdudiyyəti əlavə etməzdən əvvəl o sətri düzəltmək lazımdır.

  • Əgər əlavə olunan dəyər NULL olarsa, yoxlama aparılmayacaq. Başqa sözlə, CHECK (age >= 18) üçün age = NULL səhv verməyəcək. Çünki NULL olan istənilən ifadə avtomatik olaraq qeyri-müəyyən olur. Əgər NULL qadağan etmək istəyirsənsə, NOT NULL əlavə et.

  • CHECK içində mürəkkəb şərtlər böyük cədvəllərdə məlumat əlavə və yeniləmə zamanı performansı azalda bilər.

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