MySQL: شرح مفصل لقيود MySQL وسلامة البيانات

آخر تحديث: 2026-08-26

القيود هي حامية سلامة البيانات — فهي تمنع دخول البيانات غير الصحيحة إلى قاعدة البيانات.

يقدم هذا الدرس نظرة عامة منهجية على جميع أنواع القيود وكيفية إدارتها.

100%
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. ما ستتعلمه



2. قصة حقيقية

(1) المشكلة: البيانات غير الدقيقة منتشرة في كل مكان

بعد ستة أشهر من بدء تشغيل نظام الطلبات، كانت جودة البيانات مقلقة: فقد كانت هناك طلبات بمبالغ سالبة، و«طلبات وهمية» لا ترتبط بأي عملاء، واسم مستخدم واحد استُخدم لتسجيل خمسة حسابات. حاول فريق التطوير تنفيذ عملية التحقق من الصحة على مستوى طبقة التطبيق، ولكن مع توزع كود الواجهة الأمامية والواجهة الخلفية عبر أجزاء مختلفة من النظام، كانت هناك دائمًا ثغرات. وخلال حملة ترويجية، تمكن أحد المتسللين من تجاوز عملية التحقق من الصحة في الواجهة الأمامية وأرسل طلبًا بمبلغ سالب، مما أدى إلى خسائر مالية مباشرة.

(2) طرق حل المسائل المقيدة

فرض سلامة البيانات على مستوى قاعدة البيانات — يضمن «PRIMARY KEY» التفرد، ويضمن «FOREIGN KEY» العلاقات، ويضمن «CHECK» صحة النطاقات، ويضمن «UNIQUE» عدم وجود تكرارات.

البعد التحقق على مستوى التطبيق قيود قاعدة البيانات
نطاق الحماية هذا التطبيق فقط جميع مصادر الاتصال
إمكانية التجاوز يمكن تجاوز الواجهة الأمامية/واجهة برمجة التطبيقات لا يمكن تجاوزها
تكاليف الصيانة موزعة على مواقع متعددة مركزة في تعريفات الجداول
أمن البيانات متوسط أعلى


3. نظرة عامة على القيود الخمسة

القيد الدالة يسمح بقيمة NULL يسمح بالتكرار
المفتاح الأساسي يُعرِّف كل صف بشكل فريد
المفتاح الخارجي الروابط إلى الجداول الأخرى
فريد لا يمكن تكرار القيم
NOT NULL لا يمكن أن تكون NULL
تحقق يستوفي المعايير


4. المفتاح الأساسي

▶ مثال: قيد المفتاح الأساسي

SQL
-- 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. المفتاح الخارجي

▶ مثال: المفاتيح الخارجية والتسلسل

SQL
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

▶ مثال: قيد فريد

SQL
-- 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

▶ مثال: قيد عدم القيمة الفارغة

SQL
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

SQL
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. إدارة القيود

▶ مثال: إضافة/إزالة القيود

SQL
-- 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;
▶ جرّب الكود

❓ أسئلة شائعة

س هل تؤثر المفاتيح الخارجية على الأداء؟
ج نعم، إلى حد ما (بسبب عمليات التحقق من القيود أثناء عمليات الكتابة)، لكنها تضمن سلامة البيانات. وفي حالات التزامن العالي، يمكن إجراء عمليات التحقق على مستوى طبقة التطبيق.
س ما هي العلاقة بين NULL و UNIQUE؟
ج تسمح UNIQUE بوجود قيم NULL متعددة (في MySQL، NULL != NULL).
س هل يمكن استخدام الدوال في قيود CHECK؟
ج يدعم MySQL 8.0 والإصدارات الأحدث استخدام التعبيرات في قيود CHECK، ولكنه لا يدعم الاستعلامات الفرعية.
س هل قيود CHECK صالحة في الإصدار 5.7؟
ج لا. لا يقبل MySQL 5.7 قيود CHECK إلا من الناحية النحوية، لكنه لا يفرضها؛ ولا يتم فرضها إلا ابتداءً من الإصدار 8.0.16 أو ما بعده.
س هل تظل البيانات موجودة بعد حذف المفتاح الخارجي؟
ج نعم. إن حذف المفتاح الخارجي لا يؤدي إلا إلى إزالة القيد؛ ولا يؤدي إلى حذف أي بيانات.

📖 ملخص


📝 تمارين

  1. سؤال أساسي (مستوى الصعوبة: ⭐): أنشئ جدول «user» مع جميع القيود.

  2. تمرين متقدم (مستوى الصعوبة: ⭐⭐): أنشئ مفتاحًا خارجيًا واختبر عمليات الحذف التسلسلي.

  3. تحدي (مستوى الصعوبة: ⭐⭐⭐): صمم جدول منتجات يحتوي على قيد CHECK وتأكد من تطبيق هذا القيد.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%