MySQL: شرح مفصل لقيود MySQL وسلامة البيانات
آخر تحديث: 2026-08-26
القيود هي حامية سلامة البيانات — فهي تمنع دخول البيانات غير الصحيحة إلى قاعدة البيانات.
يقدم هذا الدرس نظرة عامة منهجية على جميع أنواع القيود وكيفية إدارتها.
graph TB
A[MySQL Constraints] --> B[PRIMARY KEY<br/>Primary Key Constraint]
A --> C[FOREIGN KEY<br/>Foreign Key Constraints]
A --> D[UNIQUE<br/>Unique Constraint]
A --> E[NOT NULL<br/>Non-empty constraint]
A --> F[CHECK<br/>Check Constraints]
C --> C1[CASCADE]
C --> C2[SET NULL]
C --> C3[RESTRICT]
1. ما ستتعلمه
- المفتاح الأساسي: قيد المفتاح الأساسي
- المفتاح الخارجي: قيود المفتاح الخارجي والتسلسل
- UNIQUE: قيد فريد
- NOT NULL: قيد عدم القيمة الفارغة
- CHECK: التحقق من القيود (8.0+)
2. قصة حقيقية
(1) المشكلة: البيانات غير الدقيقة منتشرة في كل مكان
بعد ستة أشهر من بدء تشغيل نظام الطلبات، كانت جودة البيانات مقلقة: فقد كانت هناك طلبات بمبالغ سالبة، و«طلبات وهمية» لا ترتبط بأي عملاء، واسم مستخدم واحد استُخدم لتسجيل خمسة حسابات. حاول فريق التطوير تنفيذ عملية التحقق من الصحة على مستوى طبقة التطبيق، ولكن مع توزع كود الواجهة الأمامية والواجهة الخلفية عبر أجزاء مختلفة من النظام، كانت هناك دائمًا ثغرات. وخلال حملة ترويجية، تمكن أحد المتسللين من تجاوز عملية التحقق من الصحة في الواجهة الأمامية وأرسل طلبًا بمبلغ سالب، مما أدى إلى خسائر مالية مباشرة.
(2) طرق حل المسائل المقيدة
فرض سلامة البيانات على مستوى قاعدة البيانات — يضمن «PRIMARY KEY» التفرد، ويضمن «FOREIGN KEY» العلاقات، ويضمن «CHECK» صحة النطاقات، ويضمن «UNIQUE» عدم وجود تكرارات.
| البعد | التحقق على مستوى التطبيق | قيود قاعدة البيانات |
|---|---|---|
| نطاق الحماية | هذا التطبيق فقط | جميع مصادر الاتصال |
| إمكانية التجاوز | يمكن تجاوز الواجهة الأمامية/واجهة برمجة التطبيقات | لا يمكن تجاوزها |
| تكاليف الصيانة | موزعة على مواقع متعددة | مركزة في تعريفات الجداول |
| أمن البيانات | متوسط | أعلى |
3. نظرة عامة على القيود الخمسة
| القيد | الدالة | يسمح بقيمة NULL | يسمح بالتكرار |
|---|---|---|---|
| المفتاح الأساسي | يُعرِّف كل صف بشكل فريد | ❌ | ❌ |
| المفتاح الخارجي | الروابط إلى الجداول الأخرى | ✅ | ✅ |
| فريد | لا يمكن تكرار القيم | ✅ | ❌ |
| NOT NULL | لا يمكن أن تكون NULL | ❌ | ✅ |
| تحقق | يستوفي المعايير | ✅ | ✅ |
4. المفتاح الأساسي
▶ مثال: قيد المفتاح الأساسي
-- Single-column primary key
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50)
);
-- Composite Primary Key
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id)
);
5. المفتاح الخارجي
▶ مثال: المفاتيح الخارجية والتسلسل
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
amount DECIMAL(10,2),
FOREIGN KEY (customer_id) REFERENCES customers(id)
ON DELETE CASCADE -- Cascade order deletions when deleting a customer
ON UPDATE CASCADE -- Cascade update when customer ID changes
);
-- Cascade Options
-- CASCADE: Delete Synchronously/Update
-- SET NULL: Set as NULL
-- RESTRICT: Operation Rejected(Default)
-- NO ACTION: Same as RESTRICT
6. قيد UNIQUE
▶ مثال: قيد فريد
-- Single-column, unique
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE,
username VARCHAR(50) UNIQUE
);
-- Composite Unique
CREATE TABLE user_roles (
user_id INT,
role_id INT,
UNIQUE (user_id, role_id)
);
7. قيد NOT NULL
▶ مثال: قيد عدم القيمة الفارغة
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
description TEXT -- Allow NULL
);
8. قيود CHECK (الإصدار 8.0 وما بعده)
▶ مثال: قيد CHECK
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
age INT CHECK (age >= 18 AND age <= 65),
salary DECIMAL(10,2) CHECK (salary > 0),
email VARCHAR(100) CHECK (email LIKE '%@%.%')
);
-- Add CHECK Constraints
ALTER TABLE employees ADD CONSTRAINT chk_age CHECK (age >= 18);
-- Delete CHECK Constraints
ALTER TABLE employees DROP CHECK chk_age;
9. إدارة القيود
▶ مثال: إضافة/إزالة القيود
-- Add a Primary Key
ALTER TABLE users ADD PRIMARY KEY (id);
-- Add a Foreign Key
ALTER TABLE orders ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(id);
-- Add a unique constraint
ALTER TABLE users ADD UNIQUE (email);
-- Delete Foreign Key
ALTER TABLE orders DROP FOREIGN KEY fk_customer;
-- Delete the unique constraint
ALTER TABLE users DROP INDEX email;
❓ أسئلة شائعة
📖 ملخص
- المفتاح الأساسي: معرّف فريد؛ يُنشئ تلقائيًا فهرسًا مجمَّعًا
- المفتاح الخارجي: يُنشئ علاقات بين الجداول؛ ويدعم الخيارات CASCADE وSET NULL وRESTRICT
- فريد: يجب أن تكون القيم فريدة؛ ويُسمح بالقيم NULL
- NOT NULL لا يسمح بقيم NULL
- تحقق (8.0+) تأكد من أن القيمة تستوفي المعايير
📝 تمارين
-
سؤال أساسي (مستوى الصعوبة: ⭐): أنشئ جدول «user» مع جميع القيود.
-
تمرين متقدم (مستوى الصعوبة: ⭐⭐): أنشئ مفتاحًا خارجيًا واختبر عمليات الحذف التسلسلي.
-
تحدي (مستوى الصعوبة: ⭐⭐⭐): صمم جدول منتجات يحتوي على قيد CHECK وتأكد من تطبيق هذا القيد.