الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل كتابة FK بهذة الطريقة صحيحة ؟

بدأه Sameh11 في 14 يناير 2011 · 8 رد · 730 مشاهدة · في قواعد بيانات MySQL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

هل هذا الكود صحيح وهناك في اخر الجدول 2 مفتاج اجنبي واتعرفوا في الداتا بيس علي انة مفتاح اجنبي ؟؟

REATE TABLE IF NOT EXISTS `tbl_items` (
  `item_id` int(5) NOT NULL AUTO_INCREMENT,
  `srv_id` int(5) NOT NULL,
  `srv_type` varchar(25) NOT NULL,
  `stock_available` varchar(5) NOT NULL,
  `srv_cost` decimal(5,0) NOT NULL,
  `srv_price` decimal(5,0) NOT NULL,
  `srv_available_from` date NOT NULL,
  `srv_available_to` date NOT NULL,
  `srv_duration` int(2) NOT NULL,
  `srv_description` varchar(50) DEFAULT NULL,
  `vendor_id` int(5) NOT NULL,
  `Item_img` blob NOT NULL,
  PRIMARY KEY (`item_id`),
  KEY `fk_vendor_id` (`vendor_id`),
  KEY `fk_srv_id` (`srv_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

جدالي في اخر سطرين وهم

KEY `fk_vendor_id` (`vendor_id`),

KEY `fk_srv_id` (`srv_id`)

هل معني هذا انهم اتعرفوا علي انهم مفتاحيين اجنبيين من الجدولان الاخريين ؟

مع العلم اني استخدمت احد االبرامج للربط .. ولكن في التسميات لا يوجد اطلاقا fk_000 ثم الاسم

اي الحرفان f و k غير مسميان عندي في اي خانة من خانات الجدول ولا اعلم كيف تم اضافة هذا الاختصار ؟

تم تعديل هذه المشاركة بواسطة Sameh11 في 14 يناير 2011 في 01:11

#2
Sameh11 كتب:

السلام عليكم ..

) ENGINE=MyISAM

السلام عليكم

اهم نقطة يجب ذكرها هو نوع المحرك المستخدم للجداول, في حال ربط الجداول ببعضها يجب استخدام InnoDB بدل MyISAM

هذا مثال عن كيفية إنشاء المفتاح الغريب

/index.php?showtopic=147164&view=findpost&p=740424

لاختبار صلاحية الكود قم بوضع بيانات في جدول Vendor_id و srv_id ومن ثم ضع بيانات في جدول tbl_times حيث تتناسب مع الجدولين الاولين.

إذا ادخلت بيانات ال Vendor_id و srv_id في tbl_times وكانت غير موجودة في الجدولين, عندها يجب ان يظهر خطأ وهذا يدل على ان الربط سليم

Logo150_60.jpg
#3

يعني المفتاح الغريب صحيح فقط اغير المحرك

وهل ااغير المحرك في جميع الجداول ؟

وياريت الطريقة في كيفية تحويل المحرك من داخل ال phpmyadmin

تم تعديل هذه المشاركة بواسطة Sameh11 في 15 يناير 2011 في 00:32

#4

الInnoDB يجب ان يكون لجميع الجداول التي يراد ربطها

قبل استخدام الكود التالي تاكد من تحويل الجدولين vendor_id و sry_id الى InnoDB

قم بوضع نص الخطأ في حال وجوده

CREATE TABLE IF NOT EXISTS `tbl_items` (
  `item_id` int(5) NOT NULL AUTO_INCREMENT,
  `srv_id` int(5) NOT NULL,
  `srv_type` varchar(25) NOT NULL,
  `stock_available` varchar(5) NOT NULL,
  `srv_cost` decimal(5,0) NOT NULL,
  `srv_price` decimal(5,0) NOT NULL,
  `srv_available_from` date NOT NULL,
  `srv_available_to` date NOT NULL,
  `srv_duration` int(2) NOT NULL,
  `srv_description` varchar(50) DEFAULT NULL,
  `vendor_id` int(5) NOT NULL,
  `Item_img` blob NOT NULL,
 PRIMARY KEY (`item_id`),
INDEX (vendor_id),
FOREIGN KEY (fk_vendor_id) REFERENCES customer (vendor_id)
INDEX (srv_id),
FOREIGN KEY (fk_srv_id) REFERENCES customer (srv_id))

TYPE = INNODB;
Logo150_60.jpg
#5
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INDEX (srv_id), FOREIGN KEY (fk_srv_id) REFERENCES customer (srv_id)) TYP' at line 17

حقيقة المشكلة ليست هنا المشكلة هي اني اريد ان اعرف بالطريقة هذة

KEY `fk_vendor_id` (`vendor_id`), 
  KEY `fk_srv_id` (`srv_id`)

تم تعرييفهم انك FK ؟

#6

عذرا نسيت وضع فاصله في نهايه السطر :sleep:

CREATE TABLE IF NOT EXISTS `tbl_items` (

`item_id` int(5) NOT NULL AUTO_INCREMENT,

`srv_id` int(5) NOT NULL,

`srv_type` varchar(25) NOT NULL,

`stock_available` varchar(5) NOT NULL,

`srv_cost` decimal(5,0) NOT NULL,

`srv_price` decimal(5,0) NOT NULL,

`srv_available_from` date NOT NULL,

`srv_available_to` date NOT NULL,

`srv_duration` int(2) NOT NULL,

`srv_description` varchar(50) DEFAULT NULL,

`vendor_id` int(5) NOT NULL,

`Item_img` blob NOT NULL,

PRIMARY KEY (`item_id`),

INDEX (vendor_id),

FOREIGN KEY (fk_vendor_id) REFERENCES customer (vendor_id),

INDEX (srv_id),

FOREIGN KEY (fk_srv_id) REFERENCES customer (srv_id))

TYPE = INNODB;

Logo150_60.jpg
#7
Your SQL query has been executed successfully ( Query took 0.0003 sec )

جزاك الله خيرا ..

بس عندي سؤال

ما معني REFERENCES customer ؟ هل يعني انة يشاور علي جدول الزبائن ؟

سؤال اخر ..

لم ترد علي في الرد السابق في مشكلة تعريف المفاتيح الاجنبية ( هل صحيحة بالطريقة السابقة ام لا ) لان عندي جداول كثيرة علي العمل عليها

تم تعديل هذه المشاركة بواسطة Sameh11 في 15 يناير 2011 في 01:39

#8
Sameh11 كتب:

ما معني REFERENCES customer ؟ هل يعني انة يشاور علي جدول الزبائن ؟

بالضبط فاي شيئ تضعه في fk_vendor_id سيؤشر على جدول ال customer ليتاكد من وجوده في vendor_id

ويوجد خصائص اخرى لreference

لاختبار صلاحية الكود قم بوضع بيانات في جدول Vendor_id و srv_id ومن ثم ضع بيانات في جدول tbl_times حيث تتناسب مع الجدولين الاولين.

إذا ادخلت بيانات ال Vendor_id و srv_id في tbl_times وكانت غير موجودة في الجدولين, عندها يجب ان يظهر خطأ وهذا يدل على ان الربط سليم

Sameh11 كتب:

سؤال اخر ..

لم ترد علي في الرد السابق في مشكلة تعريف المفاتيح الاجنبية ( هل صحيحة بالطريقة السابقة ام لا ) لان عندي جداول كثيرة علي العمل عليها

الصيغة التي ذكرتها هي الرسمية والمذكورة في موقع الشركة

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

اما عن الصيغة التي قمت بوضعها فلا اعرف كيفية ادراج reference لها, ولكن حاول

KEY `fk_vendor_id` reference 'customer'(`vendor_id`), 
  KEY `fk_srv_id`reference '*******' (`srv_id`)

و تستطيع العودة الى البرنامج الذي استخدمته وعند الربط بين الجداول ابحث عن خاصية "enforce referential integrity rule" او شيئ من هذا القبيل

تم تعديل هذه المشاركة بواسطة Ahmad_T في 15 يناير 2011 في 02:10

Logo150_60.jpg
#9

شكرا جزيلا جربتها وظهر لي خظأ وهذا يعني ان الربط قام بالعمل ..

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…