Constraint คือกฎที่ฐานข้อมูลบังคับใช้กับข้อมูลในตาราง — รับประกันความสมบูรณ์ของข้อมูลในระดับฐานข้อมูล (ไม่ใช่แค่ในโค้ดแอปพลิเคชัน) ตัวหลัก ๆ คือ: PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, และ
Constraint คือกฎที่ฐานข้อมูลบังคับใช้กับข้อมูลในตาราง — รับประกันความสมบูรณ์ของข้อมูลในระดับฐานข้อมูล (ไม่ใช่แค่ในโค้ดแอปพลิเคชัน) ตัวหลัก ๆ คือ: PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, และ
CHECKDEFAULTCREATE TABLE users (
id INT PRIMARY KEY, -- unique + not null identifier
email VARCHAR(255) UNIQUE NOT NULL, -- must be unique AND present
age INT CHECK (age >= 0 AND age <= 120), -- must satisfy a condition
country VARCHAR(2) DEFAULT 'US', -- default value if not provided
role VARCHAR(20) NOT NULL DEFAULT 'user',
manager_id INT REFERENCES users(id) -- FOREIGN KEY (referential integrity)
);
PRIMARY KEY → uniquely identifies a row (unique + not null, indexed)
FOREIGN KEY → references another table's key (referential integrity)
UNIQUE → no duplicate values allowed in this column
NOT NULL → the column must have a value (can't be NULL)
CHECK → the value must satisfy a condition (age >= 0, status IN (...))
DEFAULT → a value used when none is provided on insert
-- ❌ relying only on application code to enforce uniqueness:
-- a race condition or a bug or a different app could insert a duplicate
-- ✅ a UNIQUE constraint guarantees it at the DB level — ALWAYS enforced,
-- regardless of which code or how many apps access the database
email VARCHAR(255) UNIQUE
Constraint ของฐานข้อมูลคือ ปราการด่านสุดท้าย สำหรับความสมบูรณ์ของข้อมูล — มันถูกบังคับใช้ไม่ว่าโค้ดใดจะ insert ข้อมูล (หลายแอปพลิเคชัน, สคริปต์, การเปลี่ยนแปลงด้วยมือ หรือโค้ดที่มี bug) และมันจัดการ race condition ที่การตรวจสอบในระดับแอปพลิเคชันพลาดไป
CHECK (price > 0) -- prices must be positive
CHECK (status IN ('active', 'inactive')) -- only valid statuses
CHECK (end_date > start_date) -- logical consistency
CHECK บังคับใช้กฎทางธุรกิจ/โดเมนโดยตรงใน schema
Constraint จำเป็นต่อการรักษาความสมบูรณ์ของข้อมูล — มันรับประกันว่าข้อมูลในฐานข้อมูลของคุณเป็นไปตามกฎ (ความเอกลักษณ์ การมีค่า ค่าที่ถูกต้อง การอ้างอิงที่ถูกต้อง) ในระดับฐานข้อมูล ซึ่งเป็นพื้นฐานของแอปพลิเคชันที่น่าเชื่อถือ ดังนั้นการเข้าใจมันจึงสำคัญ
การรู้จักชนิดของ constraint (PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK, DEFAULT) และสิ่งที่แต่ละตัวบังคับใช้เป็นสิ่งจำเป็นสำหรับการออกแบบ schema ที่เหมาะสม
จุดเชิงแนวคิดที่สำคัญที่สุดคือ ทำไมต้องบังคับใช้ในระดับฐานข้อมูลแทนที่จะเป็นแค่ในโค้ดแอปพลิเคชัน: constraint ของฐานข้อมูลคือ ปราการด่านสุดท้าย สำหรับความสมบูรณ์ของข้อมูล — มันถูกบังคับใช้เสมอไม่ว่าโค้ดใดหรือกี่แอปพลิเคชันจะเข้าถึงข้อมูล มันดักจับ bug ที่การตรวจสอบในแอปอาจพลาด และที่สำคัญยิ่งคือมันจัดการ race condition ที่การตรวจสอบในระดับแอปพลิเคชันทำไม่ได้ (เช่น การ insert พร้อมกันสองครั้งที่ทั้งคู่ผ่านการตรวจสอบความเอกลักษณ์ในระดับแอป แต่ UNIQUE constraint ปฏิเสธรายการซ้ำได้อย่างถูกต้อง)
การพึ่งพาโค้ดแอปพลิเคชันเพียงอย่างเดียวสำหรับความสมบูรณ์เป็นเรื่องเสี่ยง; constraint ให้การรับประกัน
การเข้าใจ CHECK constraint สำหรับการบังคับใช้กฎเชิงโดเมน/ธุรกิจ (ช่วงค่าที่ถูกต้อง ค่าที่อนุญาต ความสอดคล้องเชิงตรรกะ) โดยตรงใน schema ก็มีค่าเช่นกัน
เนื่องจากความสมบูรณ์ของข้อมูลเป็นเรื่องวิกฤตสำหรับแอปพลิเคชันที่น่าเชื่อถือ และเนื่องจาก constraint ให้การรับประกันในระดับฐานข้อมูลที่ปกป้องจาก bug, race condition และข้อมูลที่ไม่สอดคล้องกันในแบบที่โค้ดแอปพลิเคชันเพียงอย่างเดียวทำไม่ได้ การเข้าใจ constraint — ชนิดต่าง ๆ การรับประกันความสมบูรณ์ของมัน และความสำคัญของการบังคับใช้ในระดับฐานข้อมูล — จึงเป็นความรู้สำคัญและพื้นฐานสำหรับการออกแบบฐานข้อมูลที่แข็งแกร่ง และเป็นแง่มุมสำคัญของการสร้างแอปพลิเคชันที่ข้อมูลคงความสอดคล้องและถูกต้อง