بخش اول: ورود به جهان قدرتمند PostgreSQL
بخش دوم: جادوی جستجو و کوئری‌نویسی
بخش سوم: بهینه‌سازی و ساختارهای پیشرفته
بخش چهارم: امنیت، پشتیبانی، عملکرد و نگه‌داری
کارگاه‌ها و مثال‌های کاربردی

نگهبانان یکپارچگی داده‌ها در جداول -> Constraints


وقتی شما یک جدول در PostgreSQL می‌سازید، در واقع فقط “ظرفی برای داده‌ها” نمی‌سازید؛ بلکه باید مطمئن شوید داده‌ای که داخل آن می‌ریزد، درست، سازگار و معتبر است.
اینجاست که Constraints وارد عمل می‌شوند — قوانینی که PostgreSQL به‌طور خودکار اجرا می‌کند تا از خراب شدن داده‌ها جلوگیری کند.


🎯 هدف Constraints چیست؟

در یک جمله:

«Constraints تضمین می‌کنند که فقط داده‌های معتبر وارد جدول شوند.»

یعنی به‌جای اعتماد به برنامه‌نویس یا اپلیکیشن، خود دیتابیس نگهبان داده‌هاست.

مثلاً:

  • هیچ کاربری با سن منفی ذخیره نشود
  • شناسه‌ی مشتری تکراری نباشد
  • فاکتوری بدون مشتری ثبت نشود

🧩 انواع اصلی Constraints در PostgreSQL

نوع Constraintهدفمثال ساده
NOT NULLجلوگیری از مقدار خالینام مشتری نباید خالی باشد
CHECKاعتبارسنجی شرطیسن باید بیشتر از صفر باشد
UNIQUEیکتا بودن مقدارایمیل نباید تکراری باشد
PRIMARY KEYشناسه‌ی یکتا و اجباریشماره‌ی کاربر منحصر به‌فرد باشد
FOREIGN KEYارتباط بین جدول‌هاهر سفارش باید مشتری معتبر داشته باشد
EXCLUSIONجلوگیری از هم‌پوشانی داده‌ها(در نوع خاصی از داده مثل زمان‌ها)

🔹 ۱. NOT NULL – ساده‌ترین نگهبان

اگر ستونی را NOT NULL تعریف کنید، PostgreSQL اجازه نمی‌دهد مقدار خالی در آن قرار گیرد.

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  email TEXT
);

🔸 تلاش برای درج رکورد ناقص:

INSERT INTO users (email) VALUES ('test@example.com');
-- ERROR:  null value in column "name" violates not-null constraint

🔹 ۲. CHECK – نگهبان منطقی

گاهی می‌خواهید قانون خاصی روی مقدارها اعمال شود.
مثلاً سن باید بین ۰ و ۱۲۰ باشد.

CREATE TABLE people (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  age INT CHECK (age >= 0 AND age <= 120)
);

🔸 درج مقدار نامعتبر:

INSERT INTO people (name, age) VALUES ('Ali', -5);
-- ERROR:  new row for relation "people" violates check constraint "people_age_check"

📘 نکته: می‌توانید چند CHECK constraint روی یک جدول داشته باشید.


🔹 ۳. UNIQUE – جلوگیری از تکرار

گاهی دو رکورد نباید مقدار تکراری در یک ستون داشته باشند (مثلاً ایمیل یا شماره ملی).

CREATE TABLE employees (
  id SERIAL PRIMARY KEY,
  email TEXT UNIQUE
);

اگر دوباره همان ایمیل را درج کنید:

INSERT INTO employees (email) VALUES ('john@company.com');
INSERT INTO employees (email) VALUES ('john@company.com');
-- ERROR: duplicate key value violates unique constraint "employees_email_key"

🧠 PostgreSQL در پس‌زمینه برای UNIQUE، یک ایندکس خودکار می‌سازد.


🔹 ۴. PRIMARY KEY – ترکیب قدرت و یکتایی

PRIMARY KEY در واقع ترکیبی از دو Constraint است:

  • مقدار آن نباید NULL باشد
  • مقدار آن باید UNIQUE باشد

یعنی بهترین گزینه برای “شناسه‌ی یکتا” در هر جدول.

CREATE TABLE products (
  product_id SERIAL PRIMARY KEY,
  name TEXT NOT NULL
);

📦 PostgreSQL خودش برای آن یک ایندکس B-tree می‌سازد.


🔹 ۵. FOREIGN KEY – نگهبان روابط

اگر جدول‌ها به هم وابسته باشند (مثل سفارش و مشتری)،
باید مطمئن شوید سفارش به مشتری واقعی اشاره دارد.
این کار را FOREIGN KEY انجام می‌دهد.

CREATE TABLE customers (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL
);

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  customer_id INT REFERENCES customers(id)
);

🔸 اگر سعی کنید سفارشی برای مشتری ناموجود ثبت کنید:

INSERT INTO orders (customer_id) VALUES (999);
-- ERROR:  insert or update on table "orders" violates foreign key constraint

✅ PostgreSQL از این طریق یکپارچگی ارجاعی (Referential Integrity) را حفظ می‌کند.


🔹 ۶. EXCLUSION – برای داده‌های پیچیده‌تر

این نوع کمتر شناخته‌شده است ولی بسیار قدرتمند.
می‌گوید “این دو سطر نباید هم‌زمان شرایط خاصی را داشته باشند.”

مثلاً اتاق رزرو شده نباید در بازه‌ی زمانی تداخل داشته باشد:

CREATE TABLE reservations (
  room INT,
  during TSRANGE,
  EXCLUDE USING GIST (room WITH =, during WITH &&)
);

⏰ یعنی دو رزرو نمی‌توانند برای یک اتاق در بازه‌ی زمانی هم‌پوشان باشند.


🧠 پشت صحنه‌ی فنی Constraints

PostgreSQL همه‌ی Constraintها را در کاتالوگ‌های سیستمی ذخیره می‌کند:

SELECT conname, contype, conrelid::regclass
FROM pg_constraint
WHERE conrelid = 'orders'::regclass;
ستونتوضیح
connameنام Constraint
contypeنوع (p=primary, f=foreign, u=unique, c=check)
conrelidجدول مربوطه

💡 نکته‌ی مهم: Deferred Constraints

گاهی می‌خواهید Constraint فقط در پایان تراکنش بررسی شود، نه بلافاصله.

CREATE TABLE accounts (
  id SERIAL PRIMARY KEY,
  balance NUMERIC CHECK (balance >= 0) DEFERRABLE INITIALLY DEFERRED
);

در این حالت می‌توانید در طول تراکنش موقتاً شرایط را نقض کنید و در انتها همه چیز بررسی شود.


🧱 جمع‌بندی

نوع Constraintکارکرد اصلیسطح کاربرد
NOT NULLمقدار نباید تهی باشدپایه
CHECKشرط منطقی روی مقداراعتبارسنجی
UNIQUEجلوگیری از تکراریکپارچگی داده
PRIMARY KEYشناسه‌ی یکتامدیریت رکورد
FOREIGN KEYارتباط بین جدول‌هایکپارچگی ارجاعی
EXCLUSIONجلوگیری از تداخلداده‌های پیشرفته

✨ نتیجه نهایی

Constraints ستون فقرات یک طراحی درست در PostgreSQL هستند.
به شما کمک می‌کنند:

  • داده‌ی نادرست وارد نشود
  • ارتباط بین جدول‌ها همیشه معتبر بماند
  • و حتی در برابر خطاهای برنامه‌نویسی مقاومت ایجاد شود.

به بیان ساده‌تر:

Constraints همان نگهبانان وفادار PostgreSQL هستند که شبانه‌روز از یکپارچگی داده‌های شما مراقبت می‌کنند. 🛡️

فروشگاه
جستجو
دوره ها

لطفا کلمات کلیدی را وارد کنید