DEV Community

iconnext for ใดๆในโลกล้วน Postgres

Posted on • Updated on

การจัดการ Enum ใน PostgreSQL: เพื่อประสิทธิภาพและความชัดเจนให้ฐานข้อมูลของคุณ

Enum คือ

Enum หรือ Enumerated Type ใน PostgreSQL เป็นเสมือนเซ็ตค่าที่กำหนดไว้ล่วงหน้า ช่วยให้คุณจำกัดข้อมูลในคอลัมน์ให้อยู่ในกรอบที่ต้องการ นึกภาพว่าคุณมีตู้เสื้อผ้าที่มีช่องเฉพาะสำหรับเสื้อผ้าแต่ละประเภท - นั่นแหละคือแนวคิดของ Enum!
ตัวอย่างที่พบบ่อย:

  • วันในสัปดาห์: จันทร์, อังคาร, พุธ, ...
  • สถานะการส่งสินค้า: กำลังแพ็คของ, กำลังจัดส่ง, จัดส่งสำเร็จ
  • ระดับความสำคัญของงาน: ต่ำ, ปานกลาง, สูง

การจัดการ Enum

1.การสร้างประเภทข้อมูล Enum

CREATE TYPE mood AS ENUM ('happy', 'neutral', 'sad');
Enter fullscreen mode Exit fullscreen mode

คำสั่งนี้สร้าง Enum ชื่อ 'mood' ที่มีค่าเป็นไปได้ 3 ค่า

โดยสามารถตรวจสอบ type ที่สรา้งขึ้นผ่านคำสั่ง

SELECT n.nspname as enum_schema,  
       t.typname as enum_name,  
       e.enumlabel as enum_value
FROM pg_type t 
   JOIN pg_enum e ON t.oid = e.enumtypid  
   JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace;
Enter fullscreen mode Exit fullscreen mode

จะแสดงรายการ

Image description

2.การนำ Enum ไปใช้ในตารางข้อมูล

เราสามารถใช้งานมันในตารางได้เหมือนกับประเภทข้อมูลอื่นๆ เพียงระบุชื่อ Enum ในนิยามคอลัมน์

CREATE TABLE daily_log (
    id SERIAL PRIMARY KEY,
    date DATE NOT NULL,
    user_mood mood NOT NULL DEFAULT 'happy'
);
Enter fullscreen mode Exit fullscreen mode

เป็นการสรา้งตาราง daily_log โดยคอลัมน์ user_mood ซึ่งเป็นประเภทข้อมูล mood Enum ที่สร้างไว้ก่อนหน้า

3.การเพิ่มข้อมูลโดยใช้ Enum

INSERT INTO daily_log (date, user_mood) VALUES 
('2024-07-12', 'happy'),
('2024-07-13', 'neutral'),
('2024-07-14', 'sad');
Enter fullscreen mode Exit fullscreen mode

4.การค้นหาข้อมูลโดยใช้ Enum

-- หาบันทึกทั้งหมดที่ผู้ใช้มีความรู้สึกมีความสุข
SELECT * FROM daily_log WHERE user_mood = 'happy';

-- หาบันทึกที่ผู้ใช้ไม่มีความสุข
SELECT * FROM daily_log WHERE user_mood != 'happy';
Enter fullscreen mode Exit fullscreen mode

5.การอัปเดตข้อมูลใน Enum

การอัปเดตข้อมูลในคอลัมน์ Enum เช่นเดียวกับคอลัมน์ประเภทข้อมูลอื่นๆ

UPDATE daily_log
SET mood = 'happy'
WHERE id = 3;
Enter fullscreen mode Exit fullscreen mode

ตัวอย่างข้างต้นเปลี่ยนแปลง user_mood ในตาราง dialy_log ที่มีค่า id 3 เป็น happy

6.การลบ Enum

การลบ Enum ได้ด้วยคำสั่ง DROP TYPE

DROP TYPE mood;
Enter fullscreen mode Exit fullscreen mode

อย่างไรก็ตาม โปรดทราบว่าการลบ Enum จะลบการอ้างอิงทั้งหมดในตารางออกด้วย

เทคนิคการใช้ Enum

การตรวจสอบ

-- ตรวจสอบว่าค่าอยู่ใน Enum หรือไม่
SELECT 'happy'::mood;  -- ทำงานได้
SELECT 'excited'::mood;  -- เกิด error

-- ดึงรายการค่าทั้งหมดของ Enum
SELECT enum_range(NULL::mood);
Enter fullscreen mode Exit fullscreen mode

การเปรียบเทียบและเรียงลำดับใน Eum

การเรียงลำดับค่า Enum ตามที่ประกาศไว้ เช่นเมื่อเราประกาศ type enum

--จากenum mood ที่สร้างขึ้นค่า 'happy' จะถูกเรียงลำดับก่อน 'neutral'
--และ 'neutral'จะถูกเรียงลำดับก่อน'sad'

-- หาบันทึกที่มีความรู้สึกดีกว่า 'neutral'
SELECT * FROM daily_log WHERE user_mood > 'neutral';

-- หาบันทึกที่มีความรู้สึกที่ไม่ใช่ 'sad'
SELECT * FROM daily_log WHERE user_mood <> 'sad';

--เรียงบันทึกความรู้สึกจาก  happy ไปถึง sad
SELECT * FROM daily_log ORDER BY user_mood;
Enter fullscreen mode Exit fullscreen mode

ฟังก์ชัน Enum ในตัว

ใน Postgres มีฟังก์ชันตัวในการจัดการกับ Enum ฟังก์ชันเหล่านี้ช่วยให้คุณสามารถตรวจสอบว่าค่าอยู่ใน Enum หรือไม่ แปลงค่าเป็นตัวอักษร หรือดึงรายการค่าที่เป็นไปได้ทั้งหมด

- has_any_status(status_array, status): ตรวจสอบว่าค่าใดๆ ใน status_array อยู่ใน status หรือไม่
-has_status(status, value): ตรวจสอบว่า value อยู่ใน status หรือไม่
- enum_label(status, value): แปลง value เป็นตัวอักษร
- enum_range(status): ดึงรายการค่าที่เป็นไปได้ทั้งหมดของ status

บทสรุป: Enum - เครื่องมือทรงพลังสำหรับฐานข้อมูลของคุณ

Enum ใน PostgreSQL เป็นเหมือนกล่องเครื่องมือพิเศษที่ช่วยให้คุณจัดการข้อมูลได้อย่างมีประสิทธิภาพ ปลอดภัย และชัดเจน แม้จะมีข้อจำกัดบ้าง แต่ด้วยการใช้งานอย่างชาญฉลาด Enum สามารถยกระดับการทำงานกับฐานข้อมูลของคุณได้อย่างมาก
ลองนำ Enum ไปใช้ในโปรเจกต์ถัดไปของคุณ และสัมผัสถึงความแตกต่างด้วยตัวคุณเอง!สำหรับคอลัมน์ที่มีค่าจำนวนมาก

โดยรวมแล้ว Enum เป็นเครื่องมือที่มีประสิทธิภาพสำหรับการจัดเก็บข้อมูลประเภทหมวดหมู่ใน Postgres ช่วยให้มั่นใจได้ว่าข้อมูลถูกต้อง ชัดเจน และง่ายต่อการจัดการ

Top comments (0)