কেন নিয়ম দরকার?
- দুইজন স্টুডেন্টের একই Student ID হয়ে যেতে পারে
- কারো নামের ঘর খালি থেকে যেতে পারে
- কারো নাম্বার -১৫ হয়ে যেতে পারে (যা অসম্ভব)
- কেউ এমন একটা ক্লাসে ভর্তি দেখাতে পারে যেই ক্লাসটাই আসলে নেই
- এরকম একটা ডাটাবেসের উপর কি ভরসা করা যায়?
- দুইজন স্টুডেন্টের কি একই Roll Number থাকা উচিত?
- একজন স্টুডেন্টের বয়স কি -১০ হতে পারে?
উত্তর স্পষ্ট — না, এরকম ডাটাবেসের উপর ভরসা করা যায় না। প্রতিটা প্রতিষ্ঠানের যেমন নিয়ম থাকে, ডাটাবেসেরও নিয়ম দরকার, যাতে ভুল ডেটা কখনোই ঢুকতে না পারে। এই নিয়মগুলোকেই SQL-এ বলা হয় Constraints।
Sequence: Keys Modules 25–29 আগে শেখা · এই Module 30 = constraint hub (NOT NULL / UNIQUE / CHECK / DEFAULT focus) · PK/FK deep = Module 25–26।
বিজনেস নিয়ম → ডাটাবেস নিয়ম → SQL Constraints হিসেবে বাস্তবায়ন
SQL Constraints আসলে কী?
Constraint হলো একটা কলামের উপর দেওয়া বিধিনিষেধ (rule), যা নিশ্চিত করে যে সেই কলামে শুধু বৈধ (valid) ডেটাই ঢুকবে। ভুল ডেটা ঢোকানোর চেষ্টা করলে ডাটাবেস নিজে থেকেই সেটা প্রত্যাখ্যান (reject) করে দেয়।
Data Type vs Constraint — পার্থক্য কী?
| বিষয় | Data Type | Constraint |
|---|---|---|
| কাজ | কলামে কী ধরনের ডেটা থাকবে তা নির্ধারণ করে (সংখ্যা, লেখা, তারিখ) | সেই ডেটার উপর অতিরিক্ত নিয়ম চাপায় |
| উদাহরণ | INT, VARCHAR, DATE | NOT NULL, UNIQUE, CHECK |
| প্রশ্নের ধরন | "এটা কী ধরনের তথ্য?" | "এই তথ্য কি বৈধ?" |
Constraint কেন গুরুত্বপূর্ণ? এটা ডেটার মান (quality) বাড়ায়, ভুল প্রবেশ আটকায়, এবং ভবিষ্যতে রিপোর্ট বা সিদ্ধান্ত নেওয়ার সময় ডেটার উপর ভরসা করা যায়।
NOT NULL Constraint
কিছু কলাম কখনোই খালি (NULL) থাকতে পারে না — যেমন Student Name, Employee ID, Product Name। এগুলোতে NOT NULL constraint দিতে হয়।
CREATE TABLE Students ( Student_ID INT AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(100) NOT NULL );
Table 'Students' created
INSERT INTO Students (Name) VALUES (NULL);
ERROR 1048 (23000): Column 'Name' cannot be null
লাইন-বাই-লাইন: Name VARCHAR(100) NOT NULL — এখানে বলা হচ্ছে Name কলামে অবশ্যই টেক্সট থাকতে হবে, খালি রাখা যাবে না। NULL পাঠানোর চেষ্টা করলেই MySQL এরর দেখায়।
UNIQUE Constraint
CREATE TABLE Students ( Student_ID INT AUTO_INCREMENT PRIMARY KEY, Email VARCHAR(100) UNIQUE ); INSERT INTO Students (Email) VALUES ('nabila@uni.edu.bd'); INSERT INTO Students (Email) VALUES ('nabila@uni.edu.bd');
ERROR 1062 (23000): Duplicate entry 'nabila@uni.edu.bd' for key 'Email'
UNIQUE vs PRIMARY KEY
| বিষয় | UNIQUE | PRIMARY KEY |
|---|---|---|
| প্রতি টেবিলে সংখ্যা | একাধিক থাকতে পারে | ঠিক ১টা |
| NULL অনুমোদন | হ্যাঁ (একাধিক NULL, MySQL-এ) | না, কখনোই না |
| উদ্দেশ্য | ডুপ্লিকেট আটকানো | রো-কে ইউনিকভাবে শনাক্ত করা (মূল পরিচয়) |
PRIMARY KEY — pointer
Primary Key = টেবিলের মূল শনাক্তকারী · সাধারণত NOT NULL + UNIQUE।
উদাহরণ স্মরণ: Order_ID INT AUTO_INCREMENT PRIMARY KEY।
FOREIGN KEY — pointer
Foreign Key = child table-এর column parent table-এর key-কে reference করে (referential integrity)।
স্মরণ: FOREIGN KEY (Customer_ID) REFERENCES Customers(Customer_ID)।
CHECK Constraint
CREATE TABLE Students ( Student_ID INT AUTO_INCREMENT PRIMARY KEY, Age INT CHECK (Age >= 0), Marks INT CHECK (Marks BETWEEN 0 AND 100) ); INSERT INTO Students (Age, Marks) VALUES (-5, 150);
ERROR 3819 (HY000): Check constraint 'students_chk_1' is violated
Age = -5 এবং Marks = 150 — দুইটাই বাস্তবে অসম্ভব মান, তাই CHECK constraint সেগুলো আটকে দিয়েছে।
CHECK (Age > 0) লিখলে বয়স ০ (নবজাতক) বাদ পড়ে যাবে — লজিকটা ব্যবসার বাস্তবতার সাথে মিলিয়ে লিখতে হবে।
DEFAULT Constraint
CREATE TABLE Students ( Student_ID INT AUTO_INCREMENT PRIMARY KEY, Country VARCHAR(50) DEFAULT 'Bangladesh', Status VARCHAR(20) DEFAULT 'Active', Admission_Date DATE DEFAULT (CURRENT_DATE) ); INSERT INTO Students () VALUES ();
+------------+-------------+--------+-----------------+ | Student_ID | Country | Status | Admission_Date | +------------+-------------+--------+-----------------+ | 1 | Bangladesh | Active | 2026-07-20 | +------------+-------------+--------+-----------------+
কোনো মান না দিলেও DEFAULT-এ বলে দেওয়া মানগুলো নিজে থেকেই বসে গেছে।
AUTO_INCREMENT
CREATE TABLE Students ( Student_ID INT AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(100) ); INSERT INTO Students (Name) VALUES ('Nabila'), ('Tanvir');
+------------+---------+ | Student_ID | Name | +------------+---------+ | 1 | Nabila | | 2 | Tanvir | +------------+---------+
আমরা Student_ID-তে কোনো মান দিইনি, MySQL নিজে থেকেই ১, ২ বসিয়ে দিয়েছে।
বিজনেস কেস স্টাডি — Student Management System
এখন সবগুলো Constraint একসাথে ব্যবহার করে একটা সম্পূর্ণ টেবিল বানাই।
CREATE TABLE Departments ( Department_ID INT AUTO_INCREMENT PRIMARY KEY, Dept_Name VARCHAR(50) NOT NULL UNIQUE ); CREATE TABLE Students ( Student_ID INT AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(100) NOT NULL, Email VARCHAR(100) NOT NULL UNIQUE, Age INT CHECK (Age >= 0), Department_ID INT, Admission_Date DATE DEFAULT (CURRENT_DATE), Status VARCHAR(20) DEFAULT 'Active', FOREIGN KEY (Department_ID) REFERENCES Departments(Department_ID) );
2 tables created successfully
| কলাম | Constraint | কেন? |
|---|---|---|
| Student_ID | PRIMARY KEY AUTO_INCREMENT | মূল পরিচয়, স্বয়ংক্রিয়ভাবে বাড়ে |
| Name | NOT NULL | নাম কখনো খালি থাকতে পারে না |
| NOT NULL UNIQUE | প্রতিটা ইমেইল ভিন্ন হতে হবে | |
| Age | CHECK | ঋণাত্মক বয়স অসম্ভব |
| Department_ID | FOREIGN KEY | শুধু বিদ্যমান ডিপার্টমেন্টেই ভর্তি সম্ভব |
| Admission_Date | DEFAULT | না দিলে আজকের তারিখ বসবে |
| Status | DEFAULT | না দিলে 'Active' বসবে |
ER ডায়াগ্রাম — সব Constraint এক নজরে
প্র্যাকটিক্যাল সেশন (MySQL Workbench / Colab)
ধাপ ১: বৈধ রেকর্ড ইনসার্ট করো
INSERT INTO Departments (Dept_Name) VALUES ('CSE'); INSERT INTO Students (Name, Email, Age, Department_ID) VALUES ('Anika Rahman', 'anika@uni.edu.bd', 20, 1);
1 department, 1 student inserted successfully Admission_Date auto-filled with today's date, Status = 'Active'
ধাপ ২: অবৈধ রেকর্ড দিয়ে চেষ্টা করো
INSERT INTO Students (Name, Email, Age, Department_ID) VALUES (NULL, 'anika@uni.edu.bd', -5, 99);
ERROR 1048: Column 'Name' cannot be null
এখানে একসাথে তিনটা ভুল আছে — NULL Name, ডুপ্লিকেট Email, ঋণাত্মক Age, এবং অস্তিত্বহীন Department_ID। MySQL প্রথম যেটা পায় সেই এররটা আগে দেখায়।
ধাপ ৩: ভুল ঠিক করো
INSERT INTO Students (Name, Email, Age, Department_ID) VALUES ('Karim Hossain', 'karim@uni.edu.bd', 21, 1);
1 row inserted successfully
সাধারণ বিগিনার ভুল
CHECK (Marks > 100) লিখলে উল্টো লজিক হয়ে যায়।ইন্ডাস্ট্রি বেস্ট প্র্যাকটিস
Data Validation
Constraint দিয়ে অ্যাপ্লিকেশন-লেভেলের ভুলের আগেই ডাটাবেস-লেভেলে ডেটা যাচাই করা হয়।
Data Integrity
সঠিক Constraint নিশ্চিত করে ডেটা সবসময় নির্ভরযোগ্য (trustworthy) থাকে।
Referential Integrity
Foreign Key নিশ্চিত করে দুই টেবিলের মধ্যে সম্পর্ক সবসময় বৈধ থাকে।
নামকরণ ও ডকুমেন্টেশন
প্রতিটা Constraint-এর একটা স্পষ্ট নাম দেওয়া ভালো (যেমন chk_age_positive), যাতে এরর মেসেজেও বোঝা যায় কোন নিয়ম ভাঙা হয়েছে।
পারফরম্যান্স বিবেচনা: প্রতিটা Constraint (বিশেষ করে UNIQUE, FOREIGN KEY) ইনডেক্স তৈরি করে, যা যাচাই করতে সামান্য সময় নেয় — কিন্তু ডেটা সঠিকতার জন্য এই খরচ মূল্যবান।
ক্লাসরুম ইন্টারঅ্যাকটিভ অ্যাক্টিভিটি
অ্যাক্টিভিটি ১ — সঠিক Constraint বাছো
"বয়স কখনো ০-এর কম হতে পারবে না" — এটা কোন Constraint দিয়ে বাস্তবায়ন হবে?
অ্যাক্টিভিটি ২ — ভুল খুঁজে বের করো
একটা CREATE TABLE কোয়েরি দেওয়া থাকবে যেখানে ইচ্ছাকৃত ভুল আছে (যেমন দুইটা PRIMARY KEY) — সেটা খুঁজে বের করো।
অ্যাক্টিভিটি ৩ — ফলাফল অনুমান করো
একটা INSERT স্টেটমেন্ট দেওয়া হবে — বলো এটা সফল হবে নাকি এরর দেবে, এবং কেন।
অ্যাক্টিভিটি ৪ — বিজনেস নিয়ম ম্যাচ করো
"প্রতিটা বইয়ের ISBN আলাদা হতে হবে" — এই নিয়মের সাথে কোন Constraint মেলে?
অ্যাক্টিভিটি ৫ — নিজে ডিজাইন করো
একটা Library বা Hospital ডাটাবেসের জন্য সবগুলো Constraint সহ একটা টেবিল ডিজাইন করো।
রিভিশন ও কুইজ
দ্রুত রিভিশন নোট
- NOT NULL — কলাম খালি রাখা যাবে না
- UNIQUE — ডুপ্লিকেট মান নিষিদ্ধ, একাধিক UNIQUE কলাম থাকতে পারে
- PRIMARY KEY — NOT NULL + UNIQUE, প্রতি টেবিলে একটাই
- FOREIGN KEY — অন্য টেবিলের Primary Key-কে রেফার করে, সম্পর্ক বৈধ রাখে
- CHECK — নির্দিষ্ট শর্ত পূরণ না করলে মান প্রত্যাখ্যাত হয়
- DEFAULT — মান না দিলে স্বয়ংক্রিয়ভাবে একটা পূর্বনির্ধারিত মান বসে
- AUTO_INCREMENT — নাম্বার নিজে থেকেই বাড়ে, সাধারণত Primary Key-এর সাথে ব্যবহৃত হয়
ইন্টারঅ্যাকটিভ কুইজ
(ক) UNIQUE (খ) CHECK (গ) NOT NULL (ঘ) DEFAULT
(ক) যত ইচ্ছা (খ) ১টা (গ) ২টা (ঘ) ০টা
(ক) UNIQUE (খ) DEFAULT (গ) FOREIGN KEY (ঘ) CHECK
(ক) FOREIGN KEY (খ) PRIMARY KEY (গ) CHECK (ঘ) NOT NULL
বোনাস ১ SQL Constraints-এর সংক্ষিপ্ত ইতিহাস
বোনাস ২ Constraint মাইন্ড ম্যাপ
সাতটা মূল Constraint এক নজরে
তুলনা টেবিলসমূহ
| PRIMARY KEY | UNIQUE |
|---|---|
| ১টা মাত্র, NULL অনুমোদন নেই | একাধিক থাকতে পারে, NULL অনুমোদিত হতে পারে |
| PRIMARY KEY | FOREIGN KEY |
|---|---|
| নিজের টেবিলের রো ইউনিকভাবে চেনায় | অন্য টেবিলের Primary Key-কে রেফার করে সম্পর্ক তৈরি করে |
| NOT NULL | CHECK |
|---|---|
| শুধু "খালি না থাকা" নিশ্চিত করে | নির্দিষ্ট শর্ত (যেমন রেঞ্জ) মেনে চলা নিশ্চিত করে |
| DEFAULT | AUTO_INCREMENT |
|---|---|
| মান না দিলে একটা নির্দিষ্ট (fixed) মান বসায় | মান না দিলে ক্রমবর্ধমান (increasing) সংখ্যা বসায় |
| Data Type | Constraint |
|---|---|
| ডেটার ধরন ঠিক করে (INT, VARCHAR) | ডেটার বৈধতা (validity) ঠিক করে (NOT NULL, CHECK) |
বোনাস ৩ মিনি প্রজেক্ট — Hospital Management System
CREATE TABLE Doctors ( Doctor_ID INT AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(100) NOT NULL ); CREATE TABLE Patients ( Patient_ID INT AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(100) NOT NULL, Age INT CHECK (Age >= 0), National_ID VARCHAR(20) NOT NULL UNIQUE, Doctor_ID INT, Admit_Date DATE DEFAULT (CURRENT_DATE), Status VARCHAR(20) DEFAULT 'Admitted', FOREIGN KEY (Doctor_ID) REFERENCES Doctors(Doctor_ID) ); INSERT INTO Doctors (Name) VALUES ('Dr. Fahmida'); INSERT INTO Patients (Name, Age, National_ID, Doctor_ID) VALUES ('Rahim Uddin', 45, '19800012345', 1);
Doctors: 1 row | Patients: 1 row Admit_Date auto-filled, Status = 'Admitted'
INSERT INTO Patients (Name, Age, National_ID, Doctor_ID) VALUES ('Fake Patient', -3, '19800012345', 1);
ERROR 3819: Check constraint violated (Age >= 0) -- এমনকি Age ঠিক করলেও, National_ID ডুপ্লিকেট হওয়ায় পরের এরর আসবে: ERROR 1062: Duplicate entry '19800012345' for key 'National_ID'
ফলাফল: একই সাথে CHECK (বয়স) ও UNIQUE (National_ID) constraint কাজ করে ভুল ডেটা আটকে দিয়েছে — এটাই Constraint-ভিত্তিক ডিজাইনের আসল শক্তি।
বোনাস ৪ প্রফেশনাল ওয়ার্কফ্লো
Database Administrator (DBA)
প্রোডাকশন ডাটাবেসে Constraint প্রয়োগ ও মনিটর করেন, যাতে ডেটা কোয়ালিটি বজায় থাকে।
Database Architect
বিজনেস রুল বিশ্লেষণ করে কোন কলামে কোন Constraint দরকার তা ডিজাইন করেন।
Data Engineer
ডেটা পাইপলাইনে Constraint লঙ্ঘনকারী রেকর্ড চিহ্নিত করে ক্লিন করেন।
Data Analyst
Constraint-সুরক্ষিত ডেটার উপর ভরসা করে নির্ভুল রিপোর্ট তৈরি করেন।
বোনাস ৫ শীর্ষ ৩০টি বিগিনার ইন্টারভিউ প্রশ্ন
শেষ ক্লাস এক্সারসাইজ ও হোমওয়ার্ক
ক্লাসরুম এক্সারসাইজ
একটা "Library" ডাটাবেসে Books ও Members টেবিল বানাও, যেখানে Book_ID Primary Key, ISBN UNIQUE, Member_Age CHECK দিয়ে সুরক্ষিত থাকবে, এবং Borrow_Date DEFAULT দিয়ে আজকের তারিখ বসবে।
হোমওয়ার্ক অ্যাসাইনমেন্ট
১. একটা "E-commerce" সিস্টেমের জন্য Products ও Orders টেবিল ডিজাইন করো, যেখানে সাতটা Constraint-ই (NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK, DEFAULT, AUTO_INCREMENT) অন্তত একবার ব্যবহৃত হয়।
২. ইচ্ছাকৃতভাবে প্রতিটা Constraint ভাঙার চেষ্টা করে ৭টা ভিন্ন এরর মেসেজ সংগ্রহ করো এবং প্রতিটার ব্যাখ্যা লেখো।
৩. লিখে ব্যাখ্যা করো — কেন Data Type যথেষ্ট না, কেন আলাদাভাবে Constraint দরকার।