PostgreSQL บังคับใช้ความถูกต้องของข้อมูลผ่าน constraint ซึ่งเป็นกฎบนข้อมูลในตาราง นอกเหนือจาก constraint มาตรฐาน (, , , , , ) แล้ว Postgres ยังเพิ่มตัวเลือกที่ทรงพลังอย่าง constraint และ expression ที่ยืดหยุ่น
PostgreSQL บังคับใช้ความถูกต้องของข้อมูลผ่าน constraint ซึ่งเป็นกฎบนข้อมูลในตาราง นอกเหนือจาก constraint มาตรฐาน (, , , , , ) แล้ว Postgres ยังเพิ่มตัวเลือกที่ทรงพลังอย่าง constraint และ expression ที่ยืดหยุ่น
PRIMARY KEYFOREIGN KEYUNIQUENOT NULLCHECKDEFAULTCHECKCREATE TABLE bookings (
id SERIAL PRIMARY KEY, -- unique identifier
room_id INT NOT NULL REFERENCES rooms(id), -- foreign key (referential integrity)
email VARCHAR(255) UNIQUE NOT NULL, -- unique + required
guests INT CHECK (guests > 0 AND guests <= 10), -- value constraint
status TEXT DEFAULT 'pending' -- default value
);
PRIMARY KEY → unique row identifier
FOREIGN KEY → references another table (referential integrity, with ON DELETE options)
UNIQUE → no duplicate values
NOT NULL → must have a value
CHECK → value must satisfy a condition
DEFAULT → default value when not provided
CHECK (price > 0)
CHECK (end_date > start_date) -- logical consistency between columns
CHECK (status IN ('active', 'inactive', 'pending'))
CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$') -- regex validation
CHECK constraint ของ Postgres สามารถบังคับใช้กฎทางธุรกิจที่หลากหลาย รวมถึงเงื่อนไขข้ามคอลัมน์และรูปแบบ regex
-- prevent OVERLAPPING bookings for the same room (impossible with UNIQUE alone!)
CREATE TABLE bookings (
room_id INT,
during TSRANGE, -- a time range
EXCLUDE USING GIST (room_id WITH =, during WITH &&) -- no two rows where room_id is
); -- equal AND time ranges OVERLAP
EXCLUDE constraint (ฟีเจอร์เฉพาะของ Postgres) ป้องกันแถวที่ขัดแย้งกันด้วย operator ที่กำหนดเอง ที่โด่งดังคือการป้องกัน ช่วงเวลาที่ทับซ้อนกัน (double-booking) ซึ่ง UNIQUE constraint ทำไม่ได้
-- check constraints at COMMIT instead of immediately (useful for circular references)
FOREIGN KEY (...) REFERENCES ... DEFERRABLE INITIALLY DEFERRED
constraint เป็นสิ่งจำเป็นต่อ ความถูกต้องของข้อมูล (data integrity) มันบังคับใช้กฎของข้อมูลในระดับฐานข้อมูล (เป็นแนวป้องกันสุดท้าย ที่ถูกบังคับใช้เสมอไม่ว่าโค้ดแอปพลิเคชันจะเป็นอย่างไร) ดังนั้นการเข้าใจการรองรับ constraint ของ PostgreSQL จึงสำคัญต่อการออกแบบฐานข้อมูลที่แข็งแกร่ง
การรู้จัก constraint มาตรฐาน (PRIMARY KEY, FOREIGN KEY พร้อม referential integrity, UNIQUE, NOT NULL, CHECK, DEFAULT) และสิ่งที่แต่ละตัวบังคับใช้เป็นพื้นฐานของการออกแบบ schema โดยให้การรับประกันในระดับฐานข้อมูล (ความไม่ซ้ำกัน, การอ้างอิงที่ถูกต้อง, ค่าที่จำเป็น, ข้อมูลที่ถูกต้อง) ซึ่งป้องกัน bug, race condition และข้อมูลที่ไม่สอดคล้องในแบบที่โค้ดแอปพลิเคชันเพียงอย่างเดียวทำไม่ได้
CHECK constraint ของ PostgreSQL มีความสามารถสูงเป็นพิเศษ บังคับใช้กฎทางธุรกิจที่หลากหลายรวมถึงเงื่อนไขข้ามคอลัมน์ (ความสอดคล้องเชิงตรรกะอย่าง end_date > start_date) และแม้กระทั่งรูปแบบ regex ช่วยให้คุณเข้ารหัสกฎของโดเมนได้โดยตรงใน schema
สิ่งที่มีคุณค่าเป็นพิเศษคือ EXCLUDE constraint เฉพาะของ Postgres ซึ่งป้องกันแถวที่ขัดแย้งกันด้วย operator ที่กำหนดเอง ที่โดดเด่นที่สุดคือ การป้องกันช่วงเวลาที่ทับซ้อนกัน (double-booking สำหรับห้อง/ทรัพยากร) ความสามารถที่ทรงพลังที่ UNIQUE constraint มาตรฐาน ทำไม่ได้ และแก้ปัญหาในโลกจริงที่พบบ่อย (การจัดตารางเวลา, การจอง) ได้อย่างหมดจดในระดับฐานข้อมูล
การเข้าใจ constraint ทั้งตัวมาตรฐานสำหรับความถูกต้อง, CHECK expression ที่ยืดหยุ่นของ Postgres และ EXCLUDE ที่ทรงพลังสำหรับการป้องกันความขัดแย้ง เป็นสิ่งสำคัญต่อการออกแบบฐานข้อมูลที่บังคับใช้ความถูกต้องโดยอัตโนมัติ
เนื่องจากความถูกต้องของข้อมูลเป็นสิ่งสำคัญยิ่งและ constraint ให้การรับประกันที่โค้ดแอปพลิเคชันทำไม่ได้ และเนื่องจาก Postgres มีตัวเลือกที่ทรงพลัง (CHECK ที่หลากหลาย, EXCLUDE สำหรับการทับซ้อน) เกินกว่าพื้นฐาน การเข้าใจการรองรับ constraint ของ PostgreSQL จึงเป็นความรู้ที่มีคุณค่าและเกี่ยวข้องเชิงปฏิบัติสำหรับการสร้างฐานข้อมูลที่แข็งแกร่ง โดย EXCLUDE constraint โดยเฉพาะเป็นความสามารถของ Postgres ที่โดดเด่นและมีประโยชน์ ควรรู้ไว้สำหรับระบบจัดตารางเวลา/การจอง