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

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

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

## การจัดการ Enum ##

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

```sql
CREATE TYPE mood AS ENUM ('happy', 'neutral', 'sad');
```
 คำสั่งนี้สร้าง Enum ชื่อ 'mood' ที่มีค่าเป็นไปได้ 3 ค่า

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

```sql
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;
```
 จะแสดงรายการ


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3wbnoxst580r9cpz1bwp.png)


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

เราสามารถใช้งานมันในตารางได้เหมือนกับประเภทข้อมูลอื่นๆ เพียงระบุชื่อ Enum ในนิยามคอลัมน์
```sql
CREATE TABLE daily_log (
    id SERIAL PRIMARY KEY,
    date DATE NOT NULL,
    user_mood mood NOT NULL DEFAULT 'happy'
);
```
เป็นการสรา้งตาราง daily_log โดยคอลัมน์ user_mood ซึ่งเป็นประเภทข้อมูล mood Enum ที่สร้างไว้ก่อนหน้า

###3.การเพิ่มข้อมูลโดยใช้ Enum ###
```sql
INSERT INTO daily_log (date, user_mood) VALUES 
('2024-07-12', 'happy'),
('2024-07-13', 'neutral'),
('2024-07-14', 'sad');
```

###4.การค้นหาข้อมูลโดยใช้ Enum###
```sql
-- หาบันทึกทั้งหมดที่ผู้ใช้มีความรู้สึกมีความสุข
SELECT * FROM daily_log WHERE user_mood = 'happy';

-- หาบันทึกที่ผู้ใช้ไม่มีความสุข
SELECT * FROM daily_log WHERE user_mood != 'happy';
```
###5.การอัปเดตข้อมูลใน Enum ###

การอัปเดตข้อมูลในคอลัมน์ Enum เช่นเดียวกับคอลัมน์ประเภทข้อมูลอื่นๆ
```sql
UPDATE daily_log
SET mood = 'happy'
WHERE id = 3;
```
ตัวอย่างข้างต้นเปลี่ยนแปลง user_mood ในตาราง dialy_log ที่มีค่า id 3 เป็น happy

###6.การลบ Enum###
การลบ Enum ได้ด้วยคำสั่ง DROP TYPE
```sql
DROP TYPE mood;
```
อย่างไรก็ตาม โปรดทราบว่าการลบ Enum จะลบการอ้างอิงทั้งหมดในตารางออกด้วย

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

-- ดึงรายการค่าทั้งหมดของ Enum
SELECT enum_range(NULL::mood);
```
###การเปรียบเทียบและเรียงลำดับใน Eum###
การเรียงลำดับค่า Enum ตามที่ประกาศไว้ เช่นเมื่อเราประกาศ type enum
```sql
--จาก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;
```


###ฟังก์ชัน 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 ช่วยให้มั่นใจได้ว่าข้อมูลถูกต้อง ชัดเจน และง่ายต่อการจัดการ