القيد
Primary key:
هذا قيد يجعل قيم العمود المراد وضع القيد عليه .. لا تتكرر ولا تكون خالية .
الان سوف نعمل هذا القيد بالطريقة الاولى على جدول جديد ويدعى
B :
كود:
create table B
( bno number primary key , bname varchar2(10) ) ;
سهلة ؟
اعتقد انها سهلة ....
عملنا جدول
B وبه عمودين .. احدهما حددناه ان يكون مفتاح اساسي .... هذا كل شيء .
الان الطريقة الثانية :
...
هل تذكر مثالنا السابق .. حينما عملنا الجدول A ؟
يوجد عمود واحد وهو ano , اريده مفتاح اساسي ... كيف ؟
فكر .. فكر .. فكر ...
كود:
alter table A
add constraint a_ano_pk primary key(ano);
نفس الشيء ... يوجد مسمى , ثم كلمة
primary key ثم بين قوسين العمود المراد وضع القيد .
القيد
Unique :
قيد يجعل قيم عمود ما , لا تتكرر . معنى
unique بالعربي ... وحيد .
الان بالطريقة الاولى , نعمل جدول يدعى بـ c ولديه عمود cno , نريد هذا قيم هذا العمود لا تتكرر ....
كود:
create table c
( cno number unique , cname varchar2(10) );
بمجرد إضافة كلمة
unique , وانتهى كل شيء .
بالطريقة الثانية ... ممممم هل تذكر الجدول B الذي عملناه قبل قليل ؟
يوجد عمود يسمى bname , اريده عمود ذو قيم لا تتكرر .....
كود:
alter table B
add constraint b_bname_uk unique(bname) ;
لاحظ المسمى
b_bname_uk , وهو مسمى من عندي , بامكانك وضع ماشئت , وبامكانك اتباع طريقتي .
يجب ان نضع اسم العمود المراد وضع أي قيد فيه بين قوسين .
القيد
Not null :
قيد يجعل قيم عمود ما , لا يمكن ان تكون خالية
.
اليك الطريقة الاولى ...
كود:
create table d
( dno number not null ) ;
عملنا الجدول
d , وبه عمود dno , وجعلنا قيم هذا العمود لا يمكن ان تكون خالية ... جرب وادخل قيم خالية , سوف يعطيك خطأ
اليك الطريقة الثانية ...
على جدول B , عمود bname , وضعنا به القيد الخاص بعدم التكرار ... صح ؟
الان اريد ان اضيف القيد الخاص بعدم وجود قيم خالية .... هل يجوز ان نضيف قيدين على عمود ؟؟ طبعا نعم ..
لكن يوجد مشكلة مع هذا القيد , انه لا يمكن اضافته بالامر alter و add ....
بل بالامر التالي :
كود:
alter table b
modify (bname varchar2(20) not null) ;
وهو تعديل العمود اصلا !!
أي كأنك سوف تعدل العمود وخصائصة , ثم تضع هذا القيد
.
هذا هو القيد الوحيد الغريب , والبقية تستخدم
add . افهم ذلك ...
.
القيد
Foreign key (references):
قيد يجعل عمود ما مفتاح اجنبي , أي انه ينشيء علاقة ما بين جدولين
.
انتبه الى نقطة مهمة !!
يجب ان يكون المفتاح الاساسي الذي سنجعله مفتاح اجنبي في الجدول الثاني .. مساوي كقيمة للمفتاح الاجنبي .. ومطابق لصفاته !!
الان دعنا ننشئ جدولين , اولهما يدعى بالمتهم
h والاخر المدعي g
كود:
create table h
( hno number ,
hname char );
اوبس .... نسيت ان اضع القيد
PRIMARY KEY ... ما رأيك ان نجرب ماذا سيحصل ؟ لنرى :
كود:
create table g
( gno number ,
ho number references h(hno) ) ;
عملنا عمود يدعى بـ
ho , وهو مفتاح اجنبي .. للمفتاح الرئيسي الموجود في الجدول h
لكن اسمه هناك
hno .... هل تعتقد ان وضع اسم للمفتاح الاجنبي غير اسم المفتاح الاساسي خطأ ؟؟ في الحقيقة لا ...
لا يوجد خطأ في ذلك ..
الان انظر النتيجة :
كود:
no matching unique or primary key for this column-list
خطأ !! ؟؟؟
يقول انه لايوجد مفتاح اساسي !!
اوه صحيح .. نسيت ان اضع القيد
PRIMARY KEY على العمود hno ....
كود:
alter table h
add constraint h_hno_pk primary key (hno) ;
الان .... نكرر العملية ونحن مرتاحو البال .
كود:
create table g
( gno number ,
ho number references h(hno) ) ;
وسوف يربط بين الجدولين ...
سوف يخبر هذا الامر أوراكل .. بأنه يوجد علاقة وثيقة واتصال عميق بين الجدول
h و g
وسوف يعيشون بسلام وأمان معا ,,,
الان بالطريقة الثانية ....تخيل لدينا جدولين اخرين ...
احدهما
U والاخر يدعى T
هيا لننشئهما .....
كود:
create table u
( uno number primary key ) ;
كود:
create table t
( tno number , uno number ) ;
الان اريد العمود
uno في جدول الـ t مفتاح اجنبي يشير الى المفتاح الاساسي uno الموجود في جدول u
اليك الامر ولاحظ ان
uno الاولى التي بين قوسين ... هي العمود الخاص بالجدول t والثانية هي الخاصة بالجدول h
كود:
alter table t
add constraint t_uno_fk foreign key (uno) references u(uno) ;
هل رأيت المسمى ؟؟ هل رأيت
foreign key ؟؟؟ هل وهل وهل ؟؟
الان عملنا الرابط الوثيق بالطريقة الثانية (الطريقة الثانية = بعد انشاء الجداول ...)
الان انتهينا من انواع القيود ...
الان ... يوجد شيئين لم اطلعك عليهما , وهو "على مستوى العمود" والاخر "على مستوى الجدول"
صراحة استغرب من هذان الشيئان ... فلا اعرف لماذا عملوها هكذا .... الان سوف اريك شيء اخر .... جدول جديد
وهو تابع للجداول التي تكلمنها عنها , والتي تسمى بـ Data Dictionary ,,, هل تذكرها ؟
جدول يعرض جميع القيود لدى جداولك , الجدول يدعى user_constraints
هيا اذهب واستعرض محتوياته ....
كود:
set linesize 10000 ;
لكي يعرض الجداول بشكل مقبول .... (كأنه يقول ... اجعل حجم السطر 10000 حرف ....)
الان اكتب جملة الاستعلام التالية ....
وهي عرض كل القيود التي على الجدول
B
كود:
select * from user_constraints where table_name='B' ;
كود:
OWNER CONSTRAINT_NAME C TABLE_NAME SEARCH_CONDITION
------------- ------------------------------ - ----------------------- -----
SCOTT B_BNAME_UK U B
SCOTT SYS_C005555 C B "BNAME" IS NOT NULL
SCOTT SYS_C005549 P B
هل تذكر تلك المسميات ؟؟
B_BNAME_UK
احد هذه المسميات ...
وقد عرض هنا !!
هل تشاهد المسميين SYS_C005555 و SYS_C005549 ؟ من اسماهما ؟؟
انه الأوراكل !!
هل المسميات هذه مهمة ؟ ولماذا ؟ ستعرف بعد قليل ....
هل تشاهد تلك الرموز ؟ U C P ….
هي رموز تشير الى القيود ..
P
أي Primary key
C أي check أو not null
U أي unique
R أي references (وهو الخاص بـ foreign key )
العمود
search_condation يعرض الشروط الخاصة بالقيد check والقيد not null
الان ...
لو عملنا جدول جديد .. وبه مفتاح اساسي ... هل نستطيع تسميته بهذا الامر :
كود:
create table XYZ
( xyzno number primary key ) ;
طبعا لا نستطيع تسميته .
انظر الى جملة الاستعلام التالية ...
كود:
select * from user_constraints where table_name='XYZ' ;
النتيجة سوف تكون ....
كود:
OWNER CONSTRAINT_NAME C TABLE_NAME SEARCH_CONDITION
---------- ------------------------- - ----------------- -----
SCOTT SYS_C005562 P XYZ
لاحظ هذه التسمية
SYS_C005562 .. أوراكل سماها .
الان نريد ان نحذف القيود جميعها من جدول ما ... كيف ؟
مالعمل ؟
اريد ان احذف القيد Primary key مثلا من جدول xyz
كيف ؟
يا ترى كيف ؟؟