أساسيات PHP

SQL: إنشاء وإدارة قواعد البيانات

13 دقيقة الدرس 31 من 45

إنشاء قاعدة بيانات

قبل أن تتمكن من تخزين البيانات، تحتاج إلى إنشاء قاعدة بيانات. عبارة CREATE DATABASE تنشئ قاعدة بيانات جديدة.

الصيغة الأساسية

CREATE DATABASE database_name;

مثال: إنشاء قاعدة بيانات

CREATE DATABASE my_shop;

اصطلاحات التسمية:

  • استخدم أحرف صغيرة
  • استخدم شرطات سفلية بدلاً من المسافات: my_shop وليس My Shop
  • كن وصفياً: ecommerce_db أفضل من db1
  • تجنب الأحرف الخاصة والكلمات المحجوزة

إنشاء قاعدة بيانات إذا لم تكن موجودة

لتجنب الأخطاء إذا كانت قاعدة البيانات موجودة بالفعل، استخدم IF NOT EXISTS:

CREATE DATABASE IF NOT EXISTS my_shop;

مجموعة الأحرف والترتيب

حدد ترميز الأحرف للتعامل الصحيح مع الأحرف الدولية:

CREATE DATABASE my_shop
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

خيارات مجموعة الأحرف

  • utf8mb4: موصى به للدعم الكامل لـ Unicode (الرموز التعبيرية، الأحرف الدولية)
  • utf8: Unicode الأساسي (دعم محدود للرموز التعبيرية)
  • latin1: أحرف أوروبا الغربية فقط

Collation يحدد كيفية مقارنة النص وفرزه:

  • utf8mb4_unicode_ci: غير حساس لحالة الأحرف، فرز دقيق
  • utf8mb4_bin: حساس لحالة الأحرف، مقارنة ثنائية

تحديد قاعدة بيانات

قبل العمل مع الجداول، تحتاج إلى تحديد قاعدة البيانات المراد استخدامها:

USE my_shop;

عرض قواعد البيانات

قائمة بجميع قواعد البيانات

SHOW DATABASES;

مثال على المخرجات:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_shop            |
| mysql              |
| performance_schema |
+--------------------+

إظهار قاعدة البيانات الحالية

SELECT DATABASE();

إنشاء الجداول

يتم إنشاء الجداول داخل قاعدة البيانات باستخدام عبارة CREATE TABLE.

هيكل الجدول الأساسي

CREATE TABLE table_name (
    column1 datatype constraints,
    column2 datatype constraints,
    column3 datatype constraints
);

مثال: جدول المستخدمين

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

فهم قيود الأعمدة

القيود الشائعة

  • PRIMARY KEY: يحدد كل صف بشكل فريد (تلقائياً NOT NULL)
  • AUTO_INCREMENT: ينشئ أرقاماً متسلسلة تلقائياً
  • NOT NULL: العمود لا يمكن أن يحتوي على قيم NULL
  • UNIQUE: يجب أن تكون جميع القيم في العمود مختلفة
  • DEFAULT: يحدد قيمة افتراضية إذا لم يتم توفير أي قيمة
  • FOREIGN KEY: يرتبط بجدول آخر (سنغطيه لاحقاً)

مثال: جدول المنتجات

CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    description TEXT,
    price DECIMAL(10, 2) NOT NULL,
    stock INT DEFAULT 0,
    category VARCHAR(50),
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

DECIMAL للأموال: استخدم دائماً DECIMAL للقيم النقدية، وليس FLOAT أو DOUBLE. DECIMAL يوفر دقة بالضبط، بينما أنواع الفاصلة العائمة يمكن أن تسبب أخطاء تقريب.

مثال: DECIMAL(10, 2) = 10 أرقام إجمالي، 2 بعد الفاصلة (الحد الأقصى: 99999999.99)

مثال: جدول الطلبات مع مفتاح خارجي

CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    total_amount DECIMAL(10, 2) NOT NULL,
    status ENUM('pending', 'processing', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

إجراءات المفتاح الخارجي

  • ON DELETE CASCADE: حذف الطلبات عند حذف المستخدم
  • ON DELETE SET NULL: تعيين user_id إلى NULL عند حذف المستخدم
  • ON DELETE RESTRICT: منع حذف المستخدم إذا كانت الطلبات موجودة
  • ON UPDATE CASCADE: تحديث المفتاح الخارجي إذا تغير المفتاح المشار إليه

إنشاء جدول إذا لم يكن موجوداً

CREATE TABLE IF NOT EXISTS users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL
);

عرض الجداول

قائمة بجميع الجداول في قاعدة البيانات الحالية

SHOW TABLES;

مثال على المخرجات:

+-------------------+
| Tables_in_my_shop |
+-------------------+
| orders            |
| products          |
| users             |
+-------------------+

عرض هيكل الجدول

DESCRIBE users;
-- أو
DESC users;
-- أو
SHOW COLUMNS FROM users;

مثال على المخرجات:

+------------+--------------+------+-----+-------------------+
| Field      | Type         | Null | Key | Default           |
+------------+--------------+------+-----+-------------------+
| id         | int(11)      | NO   | PRI | NULL              |
| username   | varchar(50)  | NO   | UNI | NULL              |
| email      | varchar(100) | NO   | UNI | NULL              |
| password   | varchar(255) | NO   |     | NULL              |
| created_at | timestamp    | NO   |     | CURRENT_TIMESTAMP |
+------------+--------------+------+-----+-------------------+

عرض عبارة إنشاء الجدول الكاملة

SHOW CREATE TABLE users;

تعديل الجداول

إضافة عمود

ALTER TABLE users
ADD COLUMN phone VARCHAR(20);

إضافة أعمدة متعددة

ALTER TABLE users
ADD COLUMN address TEXT,
ADD COLUMN city VARCHAR(50),
ADD COLUMN country VARCHAR(50);

إضافة عمود في موضع محدد

-- إضافة بعد عمود محدد
ALTER TABLE users
ADD COLUMN middle_name VARCHAR(50) AFTER username;

-- إضافة كأول عمود
ALTER TABLE users
ADD COLUMN user_id INT FIRST;

تعديل عمود

-- تغيير نوع بيانات العمود
ALTER TABLE users
MODIFY COLUMN phone VARCHAR(30);

-- تغيير اسم ونوع العمود
ALTER TABLE users
CHANGE COLUMN phone phone_number VARCHAR(30);

حذف عمود

ALTER TABLE users
DROP COLUMN middle_name;

تحذير: حذف عمود يحذف جميع البيانات في ذلك العمود بشكل دائم. احتفظ دائماً بنسخة احتياطية من قاعدة بياناتك قبل إجراء تغييرات هيكلية!

إضافة القيود

-- إضافة قيد UNIQUE
ALTER TABLE users
ADD UNIQUE (email);

-- إضافة INDEX لعمليات بحث أسرع
ALTER TABLE products
ADD INDEX idx_category (category);

-- إضافة PRIMARY KEY (إذا لم يكن موجوداً)
ALTER TABLE users
ADD PRIMARY KEY (id);

إعادة تسمية جدول

RENAME TABLE old_name TO new_name;

-- أو
ALTER TABLE old_name RENAME TO new_name;

حذف الجداول وقواعد البيانات

حذف جدول

DROP TABLE table_name;

-- نسخة آمنة (بدون خطأ إذا لم يكن موجوداً)
DROP TABLE IF EXISTS table_name;

إفراغ جدول (حذف جميع البيانات، الاحتفاظ بالهيكل)

TRUNCATE TABLE users;

DROP مقابل TRUNCATE مقابل DELETE

  • DROP TABLE: يزيل الجدول بأكمله وجميع البيانات بشكل دائم
  • TRUNCATE TABLE: يزيل جميع البيانات لكن يحتفظ بهيكل الجدول، يعيد تعيين AUTO_INCREMENT
  • DELETE FROM: يزيل البيانات صفاً تلو الآخر، يمكن استخدام شرط WHERE، لا يعيد تعيين AUTO_INCREMENT

حذف قاعدة بيانات

DROP DATABASE database_name;

-- نسخة آمنة
DROP DATABASE IF EXISTS database_name;

منطقة خطر: DROP DATABASE يحذف قاعدة البيانات بأكملها وجميع جداولها بشكل دائم. لا يوجد تراجع! أنشئ دائماً نسخ احتياطية أولاً.

الفهارس للأداء

الفهارس تسرع استرجاع البيانات لكنها تبطئ الإدراج/التحديثات. استخدمها على الأعمدة المستخدمة بشكل متكرر في شروط WHERE و ORDER BY و JOIN.

إنشاء الفهارس

-- فهرس عمود واحد
CREATE INDEX idx_username ON users(username);

-- فهرس أعمدة متعددة (مركب)
CREATE INDEX idx_name_category ON products(name, category);

-- فهرس فريد
CREATE UNIQUE INDEX idx_email ON users(email);

عرض الفهارس

SHOW INDEX FROM users;

حذف فهرس

DROP INDEX idx_username ON users;

-- أو
ALTER TABLE users DROP INDEX idx_username;

مثال عملي: قاعدة بيانات تجارة إلكترونية كاملة

-- إنشاء قاعدة البيانات
CREATE DATABASE IF NOT EXISTS ecommerce
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

USE ecommerce;

-- جدول المستخدمين
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    full_name VARCHAR(100),
    phone VARCHAR(20),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_email (email)
);

-- جدول الفئات
CREATE TABLE categories (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL UNIQUE,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- جدول المنتجات
CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    category_id INT,
    name VARCHAR(200) NOT NULL,
    description TEXT,
    price DECIMAL(10, 2) NOT NULL,
    stock INT DEFAULT 0,
    image_url VARCHAR(255),
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE SET NULL,
    INDEX idx_category (category_id),
    INDEX idx_price (price)
);

-- جدول الطلبات
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    total_amount DECIMAL(10, 2) NOT NULL,
    status ENUM('pending', 'processing', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
    shipping_address TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    INDEX idx_user (user_id),
    INDEX idx_status (status)
);

-- جدول عناصر الطلب (علاقة متعدد لمتعدد)
CREATE TABLE order_items (
    id INT PRIMARY KEY AUTO_INCREMENT,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
    FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
);

تمرين: بناء قاعدة بيانات مدونة

أنشئ هيكل قاعدة بيانات لمنصة مدونة بهذه المتطلبات:

  1. قاعدة البيانات: أنشئ blog_platform مع دعم UTF-8
  2. جدول المؤلفين: id, name, email (فريد), bio, created_at
  3. جدول المنشورات: id, author_id (مفتاح خارجي), title, content, published_at, views (افتراضي 0), created_at, updated_at
  4. جدول التعليقات: id, post_id (مفتاح خارجي), author_name, email, content, created_at
  5. جدول الوسوم: id, name (فريد)
  6. جدول Post_tags: post_id, tag_id (علاقة متعدد لمتعدد)

أضف فهارس مناسبة على المفاتيح الخارجية والأعمدة المبحوث عنها بشكل متكرر.

ملخص أفضل الممارسات

  • استخدم دائماً IF NOT EXISTS عند إنشاء قواعد البيانات/الجداول في السكريبتات
  • قم بتعيين ترميز UTF-8 (utf8mb4) لدعم الأحرف الدولية
  • يجب أن يحتوي كل جدول على PRIMARY KEY مع AUTO_INCREMENT
  • استخدم NOT NULL للحقول المطلوبة
  • أضف الطوابع الزمنية (created_at, updated_at) لتتبع التغييرات
  • استخدم DECIMAL للأموال، وليس FLOAT أو DOUBLE
  • أضف فهارس على المفاتيح الخارجية والأعمدة المستعلم عنها بشكل متكرر
  • استخدم اصطلاحات تسمية وصفية ومتسقة
  • وثق هيكل قاعدة بياناتك
  • احتفظ دائماً بنسخة احتياطية قبل إجراء تغييرات هيكلية

ما التالي؟

الآن بعد أن تعرف كيفية إنشاء وإدارة قواعد البيانات والجداول، سيغطي الدرس التالي إدراج واختيار البيانات باستخدام عبارات SQL INSERT و SELECT.