PlusMagi's Blog By Pitt Phunsanit Backend,Database รู้จัก Constraints: กฎเหล็กคุมความถูกต้องข้อมูล (NOT NULL, UNIQUE, DEFAULT, CHECK)

รู้จัก Constraints: กฎเหล็กคุมความถูกต้องข้อมูล (NOT NULL, UNIQUE, DEFAULT, CHECK)

ในฐานะ Senior Architect ที่ดูแลระบบข้อมูลขนาดใหญ่ เราทราบดีว่าข้อมูล (Data) คือสินทรัพย์ที่มีค่าที่สุดขององค์กร ความน่าเชื่อถือของข้อมูลจึงเป็นสิ่งที่เราไม่สามารถประนีประนอมได้ การที่ข้อมูลมีความถูกต้อง (Accuracy) และสอดคล้องกับกฎเกณฑ์ทางธุรกิจ (Consistency) ตั้งแต่ต้นทางจึงเป็นหัวใจสำคัญของการออกแบบฐานข้อมูลที่ดี

หากเราปล่อยให้การป้อนข้อมูลเกิดขึ้นโดยไม่มีการควบคุมที่เหมาะสม ระบบของเราอาจเผชิญกับปัญหา Data Inconsistency ซึ่งนำไปสู่การตัดสินใจทางธุรกิจที่ผิดพลาดได้ บทความนี้จะพาคุณเจาะลึกถึงกลไกที่เรียกว่า Constraints ซึ่งเปรียบเสมือน ‘กฎเหล็ก’ ที่ถูกฝังอยู่ในระดับ Schema ของ PostgreSQL เพื่อรับประกันคุณภาพและความสมบูรณ์ของข้อมูลอย่างถาวร


Constraints คืออะไร? กลไกการป้องกันข้อมูลใน PostgreSQL

Constraints คือชุดของข้อจำกัดเชิงตรรกะที่กำหนดไว้กับคอลัมน์หรือตารางในฐานข้อมูล (Database Schema) หน้าที่หลักของมันคือการตรวจสอบข้อมูลทุกแถว (Row) ที่ถูกพยายามบันทึกหรืออัปเดต เพื่อให้แน่ใจว่าข้อมูลนั้นๆ ปฏิบัติตามกฎที่เราตั้งไว้ก่อนที่ระบบจะยอมรับการเปลี่ยนแปลงใดๆ

4 Constraints หลักที่นักพัฒนาต้องรู้

ใน PostgreSQL มี Constraints หลักๆ ที่ถูกใช้บ่อยและมีความสำคัญอย่างยิ่งในการออกแบบระบบ ได้แก่:

  • NOT NULL: บังคับว่าคอลัมน์นั้นต้องมีค่าเสมอ ห้ามปล่อยว่าง (NULL) เด็ดขาด
  • UNIQUE: รับประกันว่าค่าในคอลัมน์นั้นจะไม่ซ้ำกันเลยแม้แต่ค่าเดียว (เช่น รหัสพนักงานต้องไม่ซ้ำ)
  • DEFAULT: กำหนดค่าเริ่มต้น (Default Value) ให้กับคอลัมน์นั้น หากผู้ใช้ไม่ได้ระบุข้อมูลมา
  • CHECK: เป็น Constraint ที่ทรงพลังที่สุด เพราะอนุญาตให้เรากำหนดเงื่อนไขทางธุรกิจที่ซับซ้อนได้ (เช่น อายุต้องมากกว่า 18 ปี)

การประยุกต์ใช้ Constraints ด้วย PostgreSQL Syntax

เพื่อให้เห็นภาพชัดเจน เราจะมาดูตัวอย่างการสร้างตาราง users ที่มีการใช้ Constraints ทั้ง 4 ประเภทใน PostgreSQL:

SQL

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    join_date DATE DEFAULT CURRENT_DATE,
    age INTEGER CHECK (age >= 18);
);

คำอธิบายโค้ด:

  • user_id SERIAL PRIMARY KEY: เป็นการกำหนด Primary Key ซึ่งรวมถึง NOT NULL และ UNIQUE โดยอัตโนมัติ
  • username VARCHAR(50) UNIQUE NOT NULL: บังคับว่าชื่อผู้ใช้ต้องไม่ซ้ำและห้ามเป็นค่าว่าง
  • email VARCHAR(100) UNIQUE NOT NULL: บังคับว่าอีเมลต้องไม่ซ้ำและห้ามเป็นค่าว่าง
  • join_date DATE DEFAULT CURRENT_DATE: หากเราไม่ระบุวันที่เข้าร่วม ระบบจะใช้ค่าปัจจุบันให้โดยอัตโนมัติ
  • age INTEGER CHECK (age >= 18): นี่คือตัวอย่างของ CHECK Constraint ที่บังคับว่าค่าอายุที่ป้อนเข้ามาจะต้องมีค่ามากกว่าหรือเท่ากับ 18 เท่านั้น

สรุป: ทำไม Constraints จึงสำคัญในการออกแบบระบบ?

การใช้ Constraints ไม่ใช่แค่การเพิ่มโค้ด แต่คือการสร้างชั้นของความมั่นคงทางข้อมูล (Data Integrity Layer) ตั้งแต่ระดับฐานข้อมูล การกำหนดกฎเกณฑ์เหล่านี้ตั้งแต่แรกเริ่มจะช่วยลดภาระของ Application Layer และทำให้ระบบของคุณมีความทนทาน (Robust) สามารถเชื่อถือได้ และลดโอกาสเกิด Bug ที่เกิดจากข้อมูลที่ไม่ถูกต้องได้อย่างมีประสิทธิภาพ ดังนั้น ในฐานะ System Architect การทำความเข้าใจและใช้ Constraints ให้ถูกประเภทจึงเป็นทักษะที่ขาดไม่ได้ในการสร้างระบบที่ยั่งยืน