المقدمة
المقال ده هيكون جزء من مجموعة مقالات هنبدا نتكلم فيها عن ال Constraints وبانوعها وايه ممكن يسبب Violation ليهم وفي طرقنا نبدأ نتكلم شوية عن ازي نحافظ علي ال Data Integrity للبيانات الي بنتعامل معاها بحيث ان ده ميكونش سبب ل Logical Errors في ال Reports.
ما هي ال SQL Constraints
الـ SQL Constraints هي قواعد تُطبق على أعمدة الجداول في قواعد البيانات عشان نضمان سلامة البيانات وصحتها، وهي جزء مهم من تصميم قواعد البيانات لأنها بتساعد في اننا نتحكم في نوع البيانات المدخلة وحمايتها من الأخطاء.
الأنواع الأساسية من الـ SQL Constraints
- NOT NULL: ودي بنستخدمها لو احنا عندنا Column معين او اكتر محتاجين ميتضفش فيه اي NULL Values
- UNIQUE: ودي بنستخدمها عشان نتاكد ان الدتا بتاعتنا Unique ومفيش اي دتا متكررة اكتر من مرة وهنا ممكن نقول ان Column معين لازم ميبقاش فيه تكرار او ان بيانات اكتر من Column سوا مينفعش يتكرروا
- PRIMARY KEY: هنا دي بتجمع مابين ال NOT NULL AND UNIQUE سوا وبنستخدمها عشان يبقي عندنا عمود / مجموعة اعمدة معينة القيم بتاعته / بتاعتهم سوا فريدة وبالتالى يكون identifier for each row
- Foreign KEY: ده بنستخدمه بحيث يبقي عمود معين يربط بين الجدول الاساسي بتاعنا وجدول تانى ، زي مثلا ان يبقي عندي عمود للاصناف بستخدمه عشان اربط ما بين جدول المبيعات وجدول الاصناف
- CHECK: ودي بستخدمها لو انا حبه احط شرط معين زى مثلا ان مينفعش يبقي عمود السن فيه بينات شخص سنه اقل من سن معين
- DEFAULT: وده بضيفه مثلا بحيث اقول لو مفيش داتا للعمود ده ممكن اخلي القيمه بتاعته ب 1 بحيث انه ميبقاش ب NULL
ليه محتاجين نستخدم Constraints
طيب عرفنا الأنواع الأساسية لل Constraints ايه اصلا الفايدة انى استخدم ال Constrains ؟ في اكتر من سبب بيخلينا محتاجين اننا نستخدم ال constraint.
- محتاجن ان الدتا بتاعتنا ميكونش فيها اي تكرار عشان كدا بنستخدم ال ( UNIQUE CONSTRAINT )
- نضمن ان الدتا بتاعتنا دقيقه ومفهاش أي Redundancy
- تحسين الأداء لقواعد البيانات ونخليها أكثر كفاءة في التعامل مع البيانات.
- بتساعدنا نضمان إدخال بيانات تتوافق مع قواعد العمل (Business Rules) المعتمدة في المؤسسة وبالتالي تمنع إدخال بيانات غير صحيحة أو خارج النطاق المحدد.
SQL UNIQUE Constraint
وده بيكون ليه أهمية كبيرة للـ Business لأنه بيتضمن إدخال قيم فريدة في الأعمدة المحددة، وده هيساعدنا في منع الأخطاء وتعزيز التكامل والدقة في البيانات. وبيتم استخدامه بشكل شائع لضمان عدم تكرار البيانات المهمة التي قد تؤثر على العمليات التجارية أو التحليل.
وده مثال بسيط ازاي بنخلي عمود واحد من اعمدة الجدوال UNIQUE ، هنا انا قولتله انى عايزه ال ID يكون UNIQUE بحيث ان مبقاش فيه شخصين ممكن يكون ليهم نفس ال ID
CREATE TABLE Persons (
ID int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
ولو لاحظنا هنلاقي انى برضو قولتله انى محتاجه ال ( ID, LastName ) يكونوا NOT NULL بحيث مينفعش تسجل بينات شخص انا معرفش ال ID OR LastName بتاعه.
طيب لو في حالة ان انا عندى جدول جاهز وفيه بيانات بس محتاجه اضيفله UNIQE Constraint اقدر اعمل كدا ازى ؟
ALTER TABLE Person
ADD UNIQUE (ID);
ALTER TABLE Persons
ADD CONSTRAINT UC_Person UNIQUE (ID,LastName);
هنا انا مره جربت اخلي ID هو بس ال UNIQUE ومره خليتها علي اكتر من عمود
طيب حاجه زى انى اخلي اكتر من عمود دى ممكن تكون مفيده في ايه ؟!
ممكن في جدوال المبيعات مثلا ابقي عايزه اخلى رقم الفاتوره و الصنف و ورقم الصنف جوا الفاتوره يبقوا هم ال UNIQUE Identifier بتوعي
ALTER TABLE SALES
ADD CONSTRAINT UC_SALES UNIQUE (TRANSACTION_ID, LINENUM, ITEMNUM);
طيب لو عندي constraint وحبه الغيه اعمل كدا ازى
ALTER TABLE Persons
DROP INDEX UC_Person;
طيب لو انت عندك جدوال وحبب تشوف ال Constraint اللى عليه ممكن تستخدم ال query دي
EXEC sp_help 'DB.dbo.SALES';
Violation of UNIQUE KEY Constraint
بعد ما اتكلمنا شويه عن ال Constraints وانوعها و ال UNIQUE Constraint محتاجين نبدا نشوف بقا ايه الحاجه الي ممكن تسبب ان ال constraint ده يحصله violation وبالتالي لو انت مثلا بتعمل INSERT OR UPDATE هيوقف ويبدا يطلع ايرور
- انك تكون بتحاول تضيف بيانات هي اصلاً موجود عندك في الجدول بتاعك من الاول وبالتالى هيرجعلك Error زى كدا:
Msg 2627, Level 14, State 1, Line 3
Violation of UNIQUE KEY constraint 'UQ_SALES. Cannot insert duplicate key in object 'dbo.SALES’. The duplicate key value is (000566808, 32487, 9). The statement has been terminated.
في الحاله دي ممكن تبدا تشوف ليه ال INSERT QUERY بتاعتك بتحاول تضيف دتا اصلا موجود ( ممكن نتكلم بعدين عن ازي نضمن اننا منضيفش دتا موجوده قبل كدا )
- ممكن تكون ال Insert Query بتاعتك اصلا بترجع بيانات متكرره وده ممكن يكون لان ال Source table بتاعك البيانات اللي فيه اصلا متكرره او ان ال query بتاعتك فيها مشكله فا بتكرر البيانات
- ممكن يكون فيه مشكله في البيانات بتاعتك ، طب يعنى ايه في مشكلة في البيانات ؟!
دي حاجه حصلت معايا وهي ان كل ما احاول اعمل INSERT في الجدول بتاعى يجيلى Error زى الي فوق.
وبالشكل ده انا محتاج ارجع اشوف هل المشكلة في ال query هل بترجع بيانات متكررة ؟ طب لو ملقتش بيانات متكررة ؟ طيب هل البيانات موجودة في الجدول اصلًا ؟ لا مش موجودة طيب ايه المشكلة ؟
Verify Column Data Types
اول حاجه بدات اشوفها وهي هل في اختلاف في ال column width بين الجدول بتاعى ( TARGET TABLE ) والجدول الي بقرأ الدتا منه ( SOURCE TABLE ) لان ده ممكن ينتج عنه ان الدتا ممكن متبقاش متكرره بس لما اقص جزء من ال width بتاعها تبقي متكرره.
Accent Sensitivity
يعنى ممكن يكون ال source بتاعى بيفرق بين حاجه زى ال ( a, à,á,â ) وال target table مبيفرقش بينهم فا بالتالى ال constraint بتاعى هيفضل شايف ان فيه مشكله في حين ان مكن ناحية ال source مفيش حاجه غلط.
CASE Sensitivity
ال case sensitivity برضو نفس فكرة ال accent sensitivity ممكن يكون ال source بيفرق بين ال ( A, a ) فحين ان ال target table مبيفرقش وده برضو هيسببلك نفس المشكلة.
Trim Trailing Spaces
وهى ان يكون فيه مسافات زياده في اول او في اخر الكلمه للاعمده الى من نوع ( Varchar , Char ) وبالتالى هتعمل عندك نفس المشكلة.
يعنى في الحالة بتاعتى رغم ان ال ITEM COLUMN في ال SOURCE table and Target table كان من نوع nvarcha(20) بس ال collation كانت مختلفه ( ممكن نتكلم عنها اكتر مره تانيه ) الا ان ال constraint كان شايف ان فيه مشكله فا بدات اشوف ال LEN() , DATALEN() للدتا بتاعتى
استنى استنى هو ايه الفرق بينهم اصلا ؟!
- LEN(): دي بتشوف طول الكلمه / الجمله بس بتتجاهل المسافات الزياده
- DATALEN(): دي ال Bytes المستخدمه بما فيهم من مسافات الزياده
وهو ده كان الفرق عندى لانى اكتشفت انى محتاجه اغير ال data type للعمود الي عامل مشكله ل nvarcha(30) ، فلما غيرت ال data type for target table المشكلة اتحلت.
في الختام
وبكدة نكون وصلنا لنهاية المقال، في المقال ده عرفنا يعني constraint وانوعها واتكلمنا باستفاضة أكتر عن ال UNIQUE Constraint وايه الاسباب الي ممكن تخلي انه يحصل Violation ليه ياارب المقال يكون مفيد ليكم.
Discussion