ในฐานข้อมูลเชิงสัมพันธ์ (Relational Database) การรักษาความถูกต้องและความสมบูรณ์ของข้อมูล (Data Integrity) เป็นสิ่งสำคัญที่สุด Unique Constraint (UQ) คือกลไกที่ใช้เพื่อบังคับว่าค่าในคอลัมน์ (Column) หรือกลุ่มของคอลัมน์ที่กำหนด จะต้องไม่มีการซ้ำกันโดยเด็ดขาด การเพิ่ม Unique Constraint อย่างถูกต้องจึงเป็นทักษะสำคัญสำหรับนักพัฒนาและ System Architect
บทความนี้จะแนะนำขั้นตอนการทำความเข้าใจ การตรวจสอบ และการเพิ่ม Unique Constraint ในระบบ PostgreSQL อย่างละเอียด
คุณสมบัติหลักของ Unique Constraint (UQ)
Unique Constraint มีคุณสมบัติที่ช่วยเสริมความแข็งแกร่งของโครงสร้างข้อมูล:
- ป้องกันข้อมูลซ้ำ: บังคับให้ค่าในคอลัมน์ที่ระบุต้องไม่ซ้ำกันในแต่ละแถว (Row)
- รองรับ NULL Value: โดยทั่วไป PostgreSQL จะยอมรับค่า
NULLได้หลายค่า (เนื่องจาก NULL ถูกพิจารณาว่าไม่เท่ากับค่าใดๆ) - ความยืดหยุ่น: สามารถกำหนด
UNIQUEได้หลายครั้งต่อหนึ่งตาราง (ต่างจาก Primary Key ที่มีได้เพียงเดียว) - ประสิทธิภาพ: เมื่อสร้าง Unique Constraint ระบบจะสร้าง Unique Index ให้โดยอัตโนมัติ ซึ่งช่วยเร่งความเร็วในการค้นหาข้อมูล (Query Performance)
Unique Constraint vs. Primary Key
แม้ว่าทั้งสองจะป้องกันข้อมูลซ้ำ แต่ก็มีข้อแตกต่างที่สำคัญ:
| คุณสมบัติ | Primary Key (PK) | Unique Key (UQ) |
|---|---|---|
| ความซ้ำ | ห้ามซ้ำ | ห้ามซ้ำ |
| ค่าว่าง (NULL) | ห้ามเป็น NULL (ต้องกำหนดค่าเสมอ) | เป็น NULL ได้ (โดยทั่วไป 1 ค่า) |
| จำนวนต่อตาราง | มีได้เพียง 1 เดียวมีได้หลายข้อ | |
| Index | Clustered Index (โดยปริยาย) | Non-clustered Index |
ขั้นตอนที่ 1: ตรวจสอบข้อมูลซ้ำ (Pre-Check)
ก่อนการเพิ่ม Unique Constraint คุณต้องมั่นใจว่าไม่มีข้อมูลที่ซ้ำกันอยู่แล้วในตาราง หากมีข้อมูลซ้ำ ระบบจะปฏิเสธการสร้าง Constraint
คุณสามารถใช้ Query เพื่อค้นหาค่าที่ซ้ำกันได้ดังนี้:
SQL
SELECT 1, PP_USERNAME, COUNT(*) <code>FROM PP_USERS </code>WHERE PP_USERNAME IS NOT NULL </code>GROUP BY PP_USERNAME </code>HAVING COUNT(*) > 1;
คำอธิบาย: Query นี้จะนับจำนวนครั้งที่ค่า PP_USERNAME ปรากฏมากกว่า 1 ครั้ง หาก Query นี้ส่งผลลัพธ์กลับมา แสดงว่าคุณมีข้อมูลที่ซ้ำกันและต้องดำเนินการแก้ไขก่อน
ขั้นตอนที่ 2: ลบข้อมูลซ้ำ (Data Cleanup)
หากพบข้อมูลซ้ำ คุณต้องลบแถวที่ซ้ำออกไปให้เหลือเพียงแถวเดียว (Keep One Record) โดยใช้ Window Function เช่น ROW_NUMBER():
SQL
WITH CTE AS ( <code> SELECT <code> PP_ID, <code> PP_USERNAME, <code> ROW_NUMBER() OVER (<code> PARTITION BY PP_USERNAME </code>ORDER BY PP_ID) AS rn </code> FROM PP_USERS </code>) <code>DELETE FROM PP_USERS </code>WHERE PP_ID IN (<code> SELECT PP_ID FROM CTE WHERE rn > 1);
ขั้นตอนที่ 3: เพิ่ม Unique Constraint (The Solution)
เมื่อมั่นใจว่าข้อมูลสะอาดและไม่มีค่าซ้ำแล้ว คุณสามารถใช้คำสั่ง ALTER TABLE เพื่อเพิ่ม Unique Constraint ได้เลย
ตัวอย่างการเพิ่ม UQ บนคอลัมน์เดียว:
SQL
ALTER TABLE PP_USERS <code>ADD CONSTRAINT unique_username_constraint </code>UNIQUE (PP_USERNAME);
ตัวอย่างการเพิ่ม UQ บนหลายคอลัมน์ (Composite Unique Key):
SQL
ALTER TABLE PP_USERS <code>ADD CONSTRAINT unique_user_email </code>UNIQUE (PP_USERNAME, PP_EMAIL);
บทสรุปและ Best Practices
การเพิ่ม Unique Constraint เป็นการยกระดับความแข็งแกร่งของฐานข้อมูลอย่างมาก อย่างไรก็ตาม ในฐานะ System Architect คุณควรจำไว้เสมอว่าการแก้ไขข้อมูล (Data Cleanup) มีความเสี่ยงสูง ดังนั้น:
- สำรองข้อมูล (Backup): ก่อนดำเนินการทุกครั้ง ควรสำรองข้อมูลตารางนั้นๆ เสมอ
- ทดสอบใน Staging: ควรทดสอบขั้นตอนการตรวจสอบและลบข้อมูลในสภาพแวดล้อม Staging ก่อนนำไปใช้จริง
- ระบุชื่อ Constraint: ควรตั้งชื่อ Constraint ที่สื่อความหมาย (เช่น
unique_username_constraint) เพื่อให้ง่ายต่อการจัดการและแก้ไขในอนาคต
การปฏิบัติตามขั้นตอนเหล่านี้จะช่วยให้คุณเพิ่ม Unique Constraint ได้อย่างราบรื่นและมั่นใจในความสมบูรณ์ของข้อมูล 100%