Constraints
Constraints คืออะไร?
Section titled “Constraints คืออะไร?”Constraints คือกฎที่ database บังคับให้ข้อมูลถูกต้อง — ถ้า INSERT หรือ UPDATE ผิดกฎ database จะ reject ทันที
NOT NULL — ห้ามเป็นค่าว่าง
Section titled “NOT NULL — ห้ามเป็นค่าว่าง”เหมือนการ highlight ช่องแดงเมื่อไม่กรอก แต่ไม่ได้ block จริง
// C ไม่มี null safety ต้อง check เองif (name == NULL) { printf("Error!"); }# ใช้ type hint + validationdef create_student(name: str): if not name: raise ValueError("name is required")CREATE TABLE students ( student_id VARCHAR(6) NOT NULL, name VARCHAR(100) NOT NULL, email VARCHAR(100) -- อนุญาตให้เป็น NULL ได้);
-- สำเร็จINSERT INTO students VALUES ('STD001', 'สมชาย', NULL);
-- error! name ห้ามเป็น NULLINSERT INTO students VALUES ('STD002', NULL, 'test@mail.com');-- ERROR: null value in column "name" violates not-null constraintDEFAULT — ค่าเริ่มต้น
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, activeINSERT INTO students (student_id, name)VALUES ('STD001', 'สมชาย');-- price = 0.00, enrolled_on = วันนี้, active = TRUECHECK — ตรวจสอบเงื่อนไข
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 constraintUNIQUE — ห้ามซ้ำ
Section titled “UNIQUE — ห้ามซ้ำ”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 constraintPRIMARY 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 ไม่มีในตาราง studentsINSERT INTO enrollments (student_id, course_id)VALUES ('STD999', 'CS101');-- ERROR: insert or update violates foreign key constraint