Skip to content

Constraints

Constraints คือกฎที่ database บังคับให้ข้อมูลถูกต้อง — ถ้า INSERT หรือ UPDATE ผิดกฎ database จะ reject ทันที

NOT NULL — ห้ามเป็นค่าว่าง

Section titled “NOT NULL — ห้ามเป็นค่าว่าง”

เหมือนการ highlight ช่องแดงเมื่อไม่กรอก แต่ไม่ได้ block จริง

DEFAULT — ค่าเริ่มต้น

Section titled “DEFAULT — ค่าเริ่มต้น”
CREATE TABLE students (
student_id VARCHAR(6) NOT NULL,
name VARCHAR(100) NOT NULL,
price NUMERIC(10,2) DEFAULT 0.00,
enrolled_on DATE DEFAULT CURRENT_DATE,
active BOOLEAN DEFAULT TRUE
);
-- ไม่ต้องระบุ price, enrolled_on, active
INSERT INTO students (student_id, name)
VALUES ('STD001', 'สมชาย');
-- price = 0.00, enrolled_on = วันนี้, active = TRUE

CHECK — ตรวจสอบเงื่อนไข

Section titled “CHECK — ตรวจสอบเงื่อนไข”
CREATE TABLE students (
student_id VARCHAR(6) NOT NULL,
name VARCHAR(100) NOT NULL,
price NUMERIC(10,2) CHECK (price >= 0),
email VARCHAR(100) CHECK (email LIKE '%@%')
);
-- error! price ติดลบ
INSERT INTO students VALUES ('STD001', 'สมชาย', -500, 'test@mail.com');
-- ERROR: new row violates check constraint
CREATE TABLE students (
student_id VARCHAR(6) NOT NULL UNIQUE,
email VARCHAR(100) UNIQUE -- อนุญาต NULL ได้ แต่ถ้ามีค่าต้องไม่ซ้ำ
);
INSERT INTO students VALUES ('STD001', 'a@mail.com');
INSERT INTO students VALUES ('STD002', 'a@mail.com');
-- ERROR: duplicate key value violates unique constraint

PRIMARY KEY — ตัวระบุแถวหลัก

Section titled “PRIMARY KEY — ตัวระบุแถวหลัก”

PRIMARY KEY = NOT NULL + UNIQUE — ทุกตารางควรมี 1 ตัว

CREATE TABLE students (
student_id VARCHAR(6) PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
price NUMERIC(10,2) DEFAULT 0.00,
enrolled_on DATE DEFAULT CURRENT_DATE,
active BOOLEAN DEFAULT TRUE
);

FOREIGN KEY — เชื่อมตารางเข้าด้วยกัน

Section titled “FOREIGN KEY — เชื่อมตารางเข้าด้วยกัน”
CREATE TABLE courses (
course_id VARCHAR(6) PRIMARY KEY,
course_name VARCHAR(100) NOT NULL
);
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY,
student_id VARCHAR(6) REFERENCES students(student_id),
course_id VARCHAR(6) REFERENCES courses(course_id),
enrolled_on DATE DEFAULT CURRENT_DATE
);
-- error ถ้า student_id ไม่มีในตาราง students
INSERT INTO enrollments (student_id, course_id)
VALUES ('STD999', 'CS101');
-- ERROR: insert or update violates foreign key constraint