16 / 100

CHECK

Shartni tekshirish cheklovi

Kirish: Ushbu darsda siz jadval ustunlariga kiritilayotgan yoki yangilanayotgan qiymatlarning ma'lum bir mantiqiy shartga mos kelishini tekshirish uchun PostgreSQL CHECK cheklovidan foydalanishni, yangi cheklovlar qo'shishni va ularni o'chirishni o'rganasiz.


PostgreSQL CHECK cheklovi haqida

CHECK cheklovi ma'lumotlar yaxlitligini saqlash uchun xizmat qiladi: u ustundagi qiymat har doim belgilangan mantiqiy (Boolean) ifodani qanoatlantirishini ta'minlaydi.

Agar siz CHECK shartiga to'g'ri kelmaydigan qiymatni kiritishga (INSERT) yoki yangilashga (UPDATE) urinsangiz, PostgreSQL qoidabuzarlik xatoligini chiqaradi va o'zgarishlarni bekor qiladi.

Masalan, mahsulotlar narxi yoki tovarlar soni hech qachon manfiy son bo'lmasligi kerak (price >= 0), yoki chegirmali narx doimo asosiy narxdan arzon bo'lishi kerak. Bularning barchasi CHECK cheklovi orqali ma'lumotlar bazasi darajasida kafolatlanadi.


CHECK cheklovining sintaksisi

Cheklovga o'zingiz nom berib yaratishingiz mumkin:

query.sql
CREATE TABLE jadval_nomi (
    ustun1 data_type CONSTRAINT cheklov_nomi CHECK (mantiqiy_ifoda),
    ...
);

Ushbu sintaksisda:

  • CONSTRAINT cheklov_nomi — cheklovga beriladigan nom. Agar qoidabuzarlik yuz bersa, PostgreSQL ushbu nomni xatolik matnida ko'rsatadi, bu esa muammoni tez topishga yordam beradi. (Nom berish ixtiyoriy, agar bermasangiz, PostgreSQL o'zi avtomatik nom beradi).
  • CHECK (mantiqiy_ifoda) — qavs ichidagi tekshirish sharti. Ushbu ifoda faqat shu jadval ustunlariga murojaat qilishi mumkin.

Nom bermasdan qisqaroq yozish:

query.sql
CREATE TABLE jadval_nomi (
    ustun1 data_type CHECK (mantiqiy_ifoda),
    ...
);

Bitta ustunga bir vaqtning o'zida ham NOT NULL, ham CHECK cheklovlarini qo'llash mumkin:

query.sql
CREATE TABLE jadval_nomi (
    ustun1 data_type NOT NULL CHECK (mantiqiy_ifoda),
    ...
);

Jadval darajasidagi CHECK cheklovi

Agar tekshirish sharti bir vaqtning o'zida ikkita ustunni solishtirishni talab qilsa (masalan, chegirma < narx), uni jadval oxirida e'lon qilish qulay:

query.sql
CREATE TABLE jadval_nomi (
    ustun1 data_type NOT NULL,
    ustun2 data_type NOT NULL,
    CHECK (ustun2 < ustun1)
);

Amaliy misol: Mahsulot narxini nazorat qilish

Tovarlar narxi manfiy bo'lmasligi uchun positive_price nomli CHECK cheklovi bilan products jadvalini yaratamiz:

query.sql
CREATE TABLE products (
  product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  price DEC(11, 2) NOT NULL CONSTRAINT positive_price CHECK (price >= 0),
  discounted_price DEC(11, 2) NOT NULL DEFAULT 0
);

Endi ataylab manfiy narxli tovar kiritishga urinib ko'ramiz:

query.sql
INSERT INTO products (name, price)
VALUES ('iPhone Pro 15', -1299.99);

PostgreSQL qaytargan xatolik:

kod
ERROR: new row for relation "products" violates check constraint "positive_price"

Ko'rib turganingizdek, xatoda biz qo'ygan "positive_price" nomi aniq chiqdi va noto'g'ri ma'lumot kiritilmadi.

Endi to'g'ri narx bilan kiritamiz:

query.sql
INSERT INTO products (name, price)
VALUES ('iPhone Pro 15', 1299.99) 
RETURNING *;

Natija:

product_idnamepricediscounted_price
1iPhone Pro 151299.990.00

Agar mavjud tovarni UPDATE orqali manfiy narxga o'zgartirishga urinsangiz ham, xuddi shu qoidabuzarlik xatosi yuz beradi!


Mavjud jadvalga CHECK cheklovini qo'shish

Mavjud jadvalga ALTER TABLE ... ADD CONSTRAINT orqali yangi tekshiruv qo'shish mumkin:

query.sql
ALTER TABLE jadval_nomi 
ADD CONSTRAINT cheklov_nomi 
CHECK (mantiqiy_ifoda);

Masalan, mahsulotning chegirmali narxi (discounted_price) asosiy narxdan (price) kichik va noldan katta bo'lishi shartini qo'shamiz:

Avval qatordagi chegirmali narxni yangilab olamiz:

query.sql
UPDATE products
SET discounted_price = price * 0.9
RETURNING *;

Endi jadvalga yangi tekshiruvni o'rnatamiz:

query.sql
ALTER TABLE products
ADD CONSTRAINT discounted_price_check
CHECK (discounted_price < price AND discounted_price > 0);

Endi agar kimdir chegirmali narxni asosiy narxdan qimmat qilib kiritmoqchi bo'lsa:

query.sql
INSERT INTO products (name, price, discounted_price)
VALUES ('iPhone Pro 15', 1299.99, 1399.99);

PostgreSQL darhol xatolik chiqaradi:

kod
ERROR: new row for relation "products" violates check constraint "discounted_price_check"

CHECK cheklovini o'chirib tashlash

Agar biror tekshiruv qoidasi eskirsa yoki talab o'zgarsa, uni ALTER TABLE ... DROP CONSTRAINT orqali o'chirish mumkin:

query.sql
ALTER TABLE jadval_nomi
DROP CONSTRAINT IF EXISTS cheklov_nomi;

Masalan:

query.sql
ALTER TABLE products
DROP CONSTRAINT IF EXISTS discounted_price_check;

Xulosa

  • CHECK cheklovi ustun qiymati ma'lum bir mantiqiy ifodaga bo'ysunishini ta'minlaydi.
  • Shart buzilganda PostgreSQL ma'lumot qo'shilishini yoki yangilanishini rad etadi.
  • Mavjud jadvalga cheklov qo'shish uchun ALTER TABLE ... ADD CONSTRAINT, olib tashlash uchun ALTER TABLE ... DROP CONSTRAINT ishlatiladi.
QBilimingizni sinab ko'ring
1 / 7

1. PostgreSQL CHECK cheklovining asosiy vazifasi nima?