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.
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.
Cheklovga o'zingiz nom berib yaratishingiz mumkin:
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:
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:
CREATE TABLE jadval_nomi (
ustun1 data_type NOT NULL CHECK (mantiqiy_ifoda),
...
);
Agar tekshirish sharti bir vaqtning o'zida ikkita ustunni solishtirishni talab qilsa (masalan, chegirma < narx), uni jadval oxirida e'lon qilish qulay:
CREATE TABLE jadval_nomi (
ustun1 data_type NOT NULL,
ustun2 data_type NOT NULL,
CHECK (ustun2 < ustun1)
);
Tovarlar narxi manfiy bo'lmasligi uchun positive_price nomli CHECK cheklovi bilan products jadvalini yaratamiz:
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:
INSERT INTO products (name, price)
VALUES ('iPhone Pro 15', -1299.99);
PostgreSQL qaytargan xatolik:
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:
INSERT INTO products (name, price)
VALUES ('iPhone Pro 15', 1299.99)
RETURNING *;
Natija:
| product_id | name | price | discounted_price |
|---|---|---|---|
| 1 | iPhone Pro 15 | 1299.99 | 0.00 |
Agar mavjud tovarni UPDATE orqali manfiy narxga o'zgartirishga urinsangiz ham, xuddi shu qoidabuzarlik xatosi yuz beradi!
Mavjud jadvalga ALTER TABLE ... ADD CONSTRAINT orqali yangi tekshiruv qo'shish mumkin:
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:
UPDATE products
SET discounted_price = price * 0.9
RETURNING *;
Endi jadvalga yangi tekshiruvni o'rnatamiz:
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:
INSERT INTO products (name, price, discounted_price)
VALUES ('iPhone Pro 15', 1299.99, 1399.99);
PostgreSQL darhol xatolik chiqaradi:
ERROR: new row for relation "products" violates check constraint "discounted_price_check"
Agar biror tekshiruv qoidasi eskirsa yoki talab o'zgarsa, uni ALTER TABLE ... DROP CONSTRAINT orqali o'chirish mumkin:
ALTER TABLE jadval_nomi
DROP CONSTRAINT IF EXISTS cheklov_nomi;
Masalan:
ALTER TABLE products
DROP CONSTRAINT IF EXISTS discounted_price_check;
CHECK cheklovi ustun qiymati ma'lum bir mantiqiy ifodaga bo'ysunishini ta'minlaydi.ALTER TABLE ... ADD CONSTRAINT, olib tashlash uchun ALTER TABLE ... DROP CONSTRAINT ishlatiladi.