كيفية استخدام القيود في SQL


مقدمة سريعة

يا هلا! اليوم بنتكلم عن حجر الزاوية في أي قاعدة بيانات محترمة: القيود (Constraints). باختصار، القيود هي قواعد تفرضها على البيانات في جداولك عشان تضمن دقتها وتناسقها. تخيل إنك تبني بيت بدون أساسات قوية، هذا بالضبط اللي يصير لو ما استخدمت القيود. هي اللي تحمي بياناتك من الأخطاء وتخليها موثوقة.

ليش نستخدم القيود؟

  • ضمان جودة البيانات: تمنع إدخال بيانات خاطئة أو غير صالحة.
  • الحفاظ على تكامل البيانات: تضمن أن العلاقات بين الجداول صحيحة.
  • تحسين الأداء (أحياناً): بعض القيود تساعد مُحسن الاستعلامات (Query Optimizer) على اتخاذ قرارات أفضل.

أنواع القيود الأساسية

1. NOT NULL - لا يمكن أن يكون فارغاً

هذا القيد يضمن إن العمود ما يقبل قيم NULL. يعني لازم يكون فيه قيمة.

ملاحظة: لو ما حددت قيد NOT NULL، العمود بيقبل قيم NULL بشكل افتراضي.

مثال عند إنشاء جدول:

CREATE TABLE Users (
    UserID INT NOT NULL,
    UserName VARCHAR(100) NOT NULL,
    Email VARCHAR(100)
);

مثال لإضافة القيد لعمود موجود:

ALTER TABLE Users
ALTER COLUMN UserName VARCHAR(100) NOT NULL;
-- أو (في SQL Server)
-- ALTER TABLE Users
-- ALTER COLUMN UserName ADD NOT NULL;
-- في MySQL
-- ALTER TABLE Users MODIFY COLUMN UserName VARCHAR(100) NOT NULL;

2. UNIQUE - قيمة فريدة

يضمن إن كل القيم في العمود (أو مجموعة أعمدة) تكون فريدة. يعني ما تتكرر. تقدر يكون عندك أكثر من قيد UNIQUE في الجدول.

مثال عند إنشاء جدول:

CREATE TABLE Products (
    ProductID INT NOT NULL UNIQUE,
    ProductName VARCHAR(255) NOT NULL,
    SKU VARCHAR(50) UNIQUE -- SKU يجب أن يكون فريداً
);

مثال لإضافة القيد لعمود موجود:

ALTER TABLE Products
ADD CONSTRAINT UC_SKU UNIQUE (SKU);

مثال لإسقاط (حذف) القيد:

ALTER TABLE Products
DROP CONSTRAINT UC_SKU;

3. PRIMARY KEY - المفتاح الأساسي

هذا هو القيد الأكثر أهمية! PRIMARY KEY هو مزيج من NOT NULL و UNIQUE. لازم يكون لكل جدول مفتاح أساسي واحد فقط، وهو اللي يحدد كل صف بشكل فريد. مستحيل يكون فيه صفين بنفس قيمة المفتاح الأساسي، ومستحيل يكون فارغ.

مثال عند إنشاء جدول (طريقة العمود الواحد):

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    OrderDate DATE NOT NULL,
    CustomerID INT
);

مثال عند إنشاء جدول (طريقة الجدول، لأكثر من عمود):

CREATE TABLE OrderDetails (
    OrderID INT,
    ProductID INT,
    Quantity INT,
    PRIMARY KEY (OrderID, ProductID) -- مفتاح أساسي مركب
);

مثال لإضافة القيد لعمود موجود:

ALTER TABLE Orders
ADD CONSTRAINT PK_OrderID PRIMARY KEY (OrderID);

مثال لإسقاط القيد:

ALTER TABLE Orders
DROP CONSTRAINT PK_OrderID;
-- أو (في MySQL)
-- ALTER TABLE Orders DROP PRIMARY KEY;

ملاحظة: عادةً، يتم إنشاء فهرس (Index) تلقائياً للمفتاح الأساسي عشان يسرّع البحث.

4. FOREIGN KEY - المفتاح الأجنبي

المفتاح الأجنبي يستخدم لربط جدولين ببعض، ويضمن أن البيانات في الجدول الفرعي (الجدول اللي فيه المفتاح الأجنبي) تتطابق مع البيانات في الجدول الرئيسي (الجدول اللي فيه المفتاح الأساسي). هذا يحافظ على التكامل المرجعي (Referential Integrity).

مثال عند إنشاء جدول:

CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    CustomerName VARCHAR(255) NOT NULL
);

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    OrderDate DATE NOT NULL,
    CustomerID INT,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

مثال لإضافة القيد لعمود موجود:

ALTER TABLE Orders
ADD CONSTRAINT FK_CustomerOrder
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);

مثال لإسقاط القيد:

ALTER TABLE Orders
DROP CONSTRAINT FK_CustomerOrder;

ملاحظة: تقدر تحدد سلوك المفتاح الأجنبي عند الحذف أو التحديث (مثل ON DELETE CASCADE أو ON UPDATE NO ACTION).

5. CHECK - التحقق من القيمة

هذا القيد يضمن إن القيم في العمود تتبع شرط معين. مثلاً، إن العمر يكون أكبر من 18، أو إن الراتب يكون موجب.

مثال عند إنشاء جدول:

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    FirstName VARCHAR(100),
    Age INT CHECK (Age >= 18),
    Salary DECIMAL(10, 2) CHECK (Salary > 0)
);

مثال لإضافة القيد لعمود موجود:

ALTER TABLE Employees
ADD CONSTRAINT CHK_Age CHECK (Age >= 18 AND Age <= 65);

مثال لإسقاط القيد:

ALTER TABLE Employees
DROP CONSTRAINT CHK_Age;

6. DEFAULT - القيمة الافتراضية

القيد DEFAULT يحدد قيمة افتراضية للعمود إذا لم يتم تحديد قيمة عند إدخال صف جديد. هذا مو قيد بالمعنى الصارم مثل البقية، لكنه مفيد جداً في إدارة البيانات.

مثال عند إنشاء جدول:

CREATE TABLE Tasks (
    TaskID INT PRIMARY KEY,
    TaskName VARCHAR(255) NOT NULL,
    Status VARCHAR(50) DEFAULT 'Pending',
    CreatedDate DATE DEFAULT GETDATE() -- أو CURRENT_DATE في MySQL/PostgreSQL
);

مثال لإضافة القيد لعمود موجود:

ALTER TABLE Tasks
ADD CONSTRAINT DF_Status DEFAULT 'New' FOR Status;
-- أو (في MySQL/PostgreSQL)
-- ALTER TABLE Tasks ALTER COLUMN Status SET DEFAULT 'New';

مثال لإسقاط القيد:

ALTER TABLE Tasks
DROP CONSTRAINT DF_Status;
-- أو (في MySQL/PostgreSQL)
-- ALTER TABLE Tasks ALTER COLUMN Status DROP DEFAULT;

الخلاصة

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

أتمنى يكون الدرس واضح ومفيد! لو عندك أي أسئلة، أنا موجود.