SQLوضع شروط لتخزين القيم
- مفهوم وضع شروط لتخزين القيم
- تجهيز قاعدة البيانات التي سنطبق عليها
- وضع شرط على العمود عند إنشاء الجدول
- وضع شرط على العمود بعد إنشاء الجدول
- إختبار الشروط الموضوعة على قيم الجدول
- حذف قيد الشرط الموضوع على العمود
مفهوم وضع شروط لتخزين القيم
عند تخزين البيانات في الجدول، يجب الإلتزام بنوع البيانات التي يمكن تخزينها في كل حقل. فمثلاً العمود الذي نوعه INT
يمكن أن نخزن فيه أعداد صحيحة، و العمود الذي نوعه VARCHAR
يمكن أن نخزن فيه نصوص و هكذا.
ماذا لو أردت وضع شروط على القيم التي يسمح بتخزينها، مثلاً تريد تخزين أعداد صحيحة و لكنك تريد أن تكون هذه الأعداد بين 0
و 100
فقط.
في هذه الحالة يمكنك إضافة قيد ( Constraint ) تضع فيه شرط قبول أي قيمة سيتم تخزينها في العمود.
القيد يمكن إضافته للعمود أثناء إنشاء الجدول أو في وقت لاحق.
تجهيز قاعدة البيانات التي سنطبق عليها
قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash
.
مثال
-- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها DROP DATABASE IF EXISTS harmash; -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها CREATE DATABASE harmash; -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات USE harmash;
وضع شرط على العمود عند إنشاء الجدول
أثناء إنشاء الجدول يمكنك إضافة قيد على قيم التي سيتم وضعها في الأعمدة كما يلي.
CREATE TABLE table_name ( ... CONSTRAINT constraint_name CHECK (conditions) );
- مكان الكلمة
constraint_name
نضع الإسم الذي سيتم إعطاؤه للقيد. - مكان الكلمة
conditions
نضع شروط قبول القيم في الحقول.
الإستعلام التالي ينشئ جدول جديد إسمه books
و يضيف قيد إسمه check_book_pages
يؤكد على أن قيم العمود pages
يجب أن تكون أكبر من صفر.
مثال
CREATE TABLE books ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255), pages INT, price DECIMAL(5,2), -- check_book_pages_and_price هنا قمنا بوضع قيد بإسم -- يجب أن تكون قيمته أكبر من 0 pages يحدد أن العمود CONSTRAINT check_book_pages CHECK (pages > 0) );
وضع شرط على العمود بعد إنشاء الجدول
في حال كان لديك جدول و تريد وضع شروط على القيم التي سيتم تخزينها فيه يمكنك تعديل الجدول و إضافة الشرط فيه كقيد كما يلي.
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (conditions);
- مكان الكلمة
constraint_name
نضع الإسم الذي سيتم إعطاؤه للقيد. - مكان الكلمة
conditions
نضع شروط قبول القيم في الحقول.
الإستعلام التالي يضيف قيد إسمه check_book_price
يؤكد على أن قيم العمود price
يجب أن تكون بين 0 و 50.
مثال
ALTER TABLE books -- books هنا قمنا بتحديد أننا نريد إجراء تعديل على بنية الجدول ADD CONSTRAINT check_book_price -- check_book_price هنا قمنا بوضع قيد إسمه CHECK (price BETWEEN 0 AND 50) -- يجب أن تكون بين 0 و 50 price يحدد أن قيمة العمود
إختبار الشروط الموضوعة على قيم الجدول
الإستعلام التالي يحاول إضافة سطر في الجدول books
و لكنه سيفشل لأن القيمة الموضوعة في الحقل pages
أصغر من صفر.
المثال الأول
INSERT INTO books (title, pages, price) VALUES ('SQL for dummies', -20, 15);
النتيجة
النتيجة تعني أنه لم يتم إضافة السطر و هذا الأمر حدث بسبب أن القيد check_book_pages
فحص القيمة المدخلة في الحقل pages
و وجدها لم تطابق الشرط الموضوع فيه.
الإستعلام التالي يحاول إضافة سطر في الجدول books
و لكنه سيفشل لأن القيمة الموضوعة في الحقل price
ليست بين 0 و 50.
المثال الثاني
INSERT INTO books (title, pages, price) VALUES ('SQL for dummies', 240, 70);
النتيجة
النتيجة تعني أنه لم يتم إضافة السطر و هذا الأمر حدث بسبب أن القيد check_book_price
فحص القيمة المدخلة في الحقل price
و وجدها لم تطابق الشرط الموضوع فيه.
الإستعلام التالي يحاول إضافة سطر في الجدول books
وسينجح في ذلك لأن جميع القيم المدخلة لا تخالف القيود الموضوعة على الأعمدة.
المثال الثالث
INSERT INTO books (title, pages, price) VALUES ('SQL for dummies', 240, 24.99);
النتيجة
النتيجة تعني أنه تم إضافة السطر في الجدول.
حذف قيد الشرط الموضوع على العمود
لحذف قيد الشرط الموضوع على القيم التي يمكن تخزينها في العمود يمكنك استخدام الأمر ALTER
كما يلي.
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
- مكان الكلمة
table_name
نضع إسم الجدول الذي يحتوي على القيد. - مكان الكلمة
constraint_name
نضع إسم القيد الذي نريد حذفه.
الإستعلام التالي يقوم بحذف القيد check_book_price
من الجدول books
.
مثال
ALTER TABLE books -- books هنا قمنا بتحديد أننا نريد إجراء تعديل على بنية الجدول DROP CONSTRAINT check_book_price; -- من الجدول check_book_price هنا قمنا بتحديد أننا نريد حذف القيد