المقدمة 

 المقال ده هيكون جزء من مجموعة مقالات هنبدا نتكلم فيها عن ال 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.

  1. محتاجن ان الدتا بتاعتنا ميكونش فيها اي تكرار عشان كدا بنستخدم ال ( UNIQUE CONSTRAINT )  
  2. نضمن ان الدتا بتاعتنا دقيقه ومفهاش أي Redundancy 
  3. تحسين الأداء لقواعد البيانات ونخليها أكثر كفاءة في التعامل مع البيانات.
  4. بتساعدنا نضمان إدخال بيانات تتوافق مع قواعد العمل (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  هيوقف ويبدا يطلع ايرور 

  1. انك تكون بتحاول تضيف بيانات هي اصلاً موجود عندك في الجدول بتاعك من الاول وبالتالى هيرجعلك 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  بتاعتك بتحاول تضيف دتا اصلا موجود ( ممكن نتكلم بعدين عن ازي نضمن اننا منضيفش دتا موجوده قبل كدا )

  1. ممكن تكون ال Insert Query  بتاعتك اصلا بترجع بيانات متكرره وده ممكن يكون لان ال Source table بتاعك البيانات اللي فيه اصلا متكرره او ان ال query  بتاعتك فيها مشكله فا بتكرر البيانات 
  2. ممكن يكون فيه مشكله في البيانات بتاعتك  ، طب يعنى ايه في مشكلة في البيانات ؟! 

دي حاجه حصلت معايا وهي ان كل ما احاول اعمل  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  ليه ياارب المقال يكون مفيد ليكم.