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?
- Məlumat keyfiyyətinin qorunması:
CHECKcədvələ səhv və ya məntiqə uyğun olmayan məlumatların düşməsinin qarşısını alır. - 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.
- 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:
- Online mağazalar: mənfi qiymətli məhsulların əlavə olunmasının qadağan edilməsi.
- Təhsil platformaları: kurs iştirakçılarının yaşının yoxlanılması.
- 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:
CHECKiç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
NULLolarsa, yoxlama aparılmayacaq. Başqa sözlə,CHECK (age >= 18)üçünage = NULLsəhv verməyəcək. ÇünkiNULLolan istənilən ifadə avtomatik olaraq qeyri-müəyyən olur. ƏgərNULLqadağan etmək istəyirsənsə,NOT NULLəlavə et.CHECKiç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.
GO TO FULL VERSION