Sanash ma'lumot turi
Ushbu qo'llanmada PostgreSQLda ustunga faqat belgilangan qat'iy ro'yxatdagi qiymatlarni kiritishni cheklash uchun ENUM (sanash) ma'lumot turidan qanday foydalanishni o'rganasiz.
ENUM (enumerated type) — bu oldindan e'lon qilingan statik qiymatlar ro'yxatidan iborat ma'lumot turidir.
ENUM yaratish sintaksisi:
CREATE TYPE enum_name AS ENUM ('value1', 'value2', 'value3');
Sintaksis tushuntirishi:
enum_name — yaratilayotgan sanash turining nomi.('value1', 'value2', ...) — ruxsat etilgan qiymatlar ro'yxati.Avval buyurtma ustuvorligini ifodalovchi priority_type turini yaratamiz:
DROP TYPE IF EXISTS priority_type CASCADE;
CREATE TYPE priority_type AS ENUM ('low', 'medium', 'high');
Endi undan jadval ustunida foydalanamiz:
DROP TABLE IF EXISTS transfer_orders CASCADE;
CREATE TABLE transfer_orders (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
product_id INT NOT NULL,
from_warehouse INT NOT NULL,
to_warehouse INT NOT NULL,
quantity INT CHECK (quantity > 0),
priority priority_type NOT NULL DEFAULT 'medium'
);
Jadvalga bir nechta buyurtma kiritamiz:
INSERT INTO transfer_orders (product_id, from_warehouse, to_warehouse, quantity, priority)
VALUES
(1, 1, 2, 50, 'high'),
(2, 2, 1, 20, 'low'),
(2, 2, 1, 20, 'medium'),
(3, 1, 2, 30, 'high');
Agar ro'yxatda mavjud bo'lmagan qiymat kiritilsa:
INSERT INTO transfer_orders (product_id, from_warehouse, to_warehouse, quantity, priority)
VALUES (4, 1, 2, 10, 'critical');
PostgreSQL xatolik chiqaradi:
ERROR: invalid input value for enum priority_type: "critical"
ENUM qiymatlari yaratilish paytidagi tartib bo'yicha taqqoslanadi ('low' < 'medium' < 'high'):
SELECT product_id, quantity, priority
FROM transfer_orders
ORDER BY priority DESC;
Natija:
product_id | quantity | priority
------------+----------+----------
1 | 50 | high
3 | 30 | high
2 | 20 | medium
2 | 20 | low
High ustuvorlikdagi buyurtmalarni filtrlash:
SELECT product_id, quantity, priority
FROM transfer_orders
WHERE priority = 'high';
Mavjud priority_type ga yangi 'urgent' qiymatini qo'shish:
ALTER TYPE priority_type
ADD VALUE 'urgent';
Yangi qiymatni boshqa qiymatdan oldin yoki keyin joylashtirish mumkin:
ALTER TYPE priority_type
ADD VALUE 'critical' BEFORE 'high';
PostgreSQL 10 dan boshlab enum qiymatini qayta nomlash mumkin:
ALTER TYPE priority_type
RENAME VALUE 'urgent' TO 'very high';
SELECT ENUM_RANGE(NULL::priority_type) AS all_priorities;
Natija:
all_priorities
------------------------------------------
{low,medium,critical,high,"very high"}
Qachon qaysi birini ishlatish kerak?
ENUM ustun qiymatlarini belgilangan qat'iy ro'yxat bilan cheklaydi.CREATE TYPE ... AS ENUM orqali yangi enum turi yaratiladi.ALTER TYPE ... ADD VALUE yangi qiymatlar qo'shish imkonini beradi.