it-swarm.asia

إعداد المفاتيح الأجنبية في phpMyAdmin؟

أقوم بإعداد قاعدة بيانات باستخدام phpMyAdmin. لدي جدولان (foo و bar) ، فهرستها على مفاتيحها الأساسية . أحاول إنشاء جدول علائقي (foo_bar) بينهما ، باستخدام مفاتيحها الأساسية كمفاتيح خارجية.

لقد قمتُ بإنشاء هذه الجداول باسم MyISAM ، لكنني تغيرت منذ ذلك الحين إلى InnoDB ، لأنني قرأت أن MyISAM لا يدعم المفاتيح الخارجية. جميع id_ الحقول هي INT(11).

عندما أختار جدول foo_bar ، انقر فوق الرابط "عرض العلاقة" ، وحاول تعيين أعمدة FK لتكون database.foo.id و database.bar.id ، فهذا يعني "لا يوجد فهرس محدد!" بجانب كل عمود.

ماذا ينقصني؟

توضيح/تحديث

من أجل البساطة ، أريد الاستمرار في استخدام phpMyAdmin. أنا أستخدم XAMPP حاليًا ، وهو أمر سهل بما فيه الكفاية للسماح لي بالتركيز على PHP/CSS/Javascript ، وهو يأتي مع phpMyAdmin.

أيضًا ، على الرغم من أنني لم أتمكن من إعداد مفاتيح أجنبية صريحة حتى الآن ، إلا أنني لدي جدول علائقي وأستطيع أن أؤدي روابط مثل هذا:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

هذا فقط يجعلني غير مرتاح لعدم تحديد FKs بشكل صريح في قاعدة البيانات.

313
Nathan Long

إذا كنت تريد استخدام phpMyAdmin لإعداد العلاقات ، فعليك القيام بأمرين. بادئ ذي بدء ، يجب عليك تحديد فهرس في عمود المفتاح الخارجي في جدول الإحالة (لذلك foo_bar.foo_id ، في حالتك). بعد ذلك ، انتقل إلى عرض العلاقة (في جدول الإحالة) وحدد العمود المشار إليه (حتى في حالتك foo.id) وفي التحديث وفي إجراءات الحذف.

أعتقد أن المفاتيح الخارجية مفيدة إذا كان لديك جداول متعددة مرتبطة ببعضها البعض ، على وجه الخصوص ، ستصبح نصوص الحذف قصيرة جدًا إذا قمت بتعيين خيارات المراجع بشكل صحيح.

تحرير: تأكد من أن كلا الجدولين قد حدد محرك InnoDB.

341
rael_kid

يتيح لك phpMyAdmin تحديد المفاتيح الخارجية باستخدام طريقة عرض "العلاقات" الخاصة بهم. ولكن بما أن MySQL لا تدعم سوى القيود الخارجية على جداول "INNO DB" ، فإن الخطوة الأولى هي التأكد من أن الجداول التي تستخدمها من هذا النوع.

لإعداد مفتاح خارجي بحيث يشير عمود PID في جدول باسم CHILD إلى عمود المعرف في جدول يسمى PARENT ، يمكنك القيام بما يلي:

  1. لكلا الجدولين ، انتقل إلى علامة التبويب "العمليات" وقم بتغيير نوعهما إلى "INNO DB"
  2. تأكد من أن المعرف هو المفتاح الأساسي (أو على الأقل عمود مفهرس) من جدول PARENT.
  3. في جدول CHILD ، حدد فهرس لعمود PID.
  4. أثناء عرض علامة تبويب الهيكل في جدول CHILD ، انقر على الرابط "عرض العلاقة" الموجود أعلى قسم "إضافة حقول" مباشرةً.
  5. سيتم إعطاؤك جدول حيث يتوافق كل صف مع عمود مفهرس في جدول العميل. تتيح لك القائمة المنسدلة الأولى في كل صف اختيار TABLE-> COLUMN المراجع في العمود المفهرسة. في صف PID ، اختر PARENT-> ID من القائمة المنسدلة وانقر فوق GO.

عن طريق القيام بعملية تصدير على جدول CHILD ، سترى أنه تم إنشاء قيد مفتاح خارجي لعمود PID.

218
awais

هذا ملخص لمقال ويكيبيديا. تحدد أنواع العلاقات المختلفة التي يمكنك تحديدها في PHPmyadmin. أضعه هنا لأنه مرتبط بتعليق @ Nathan على تعيين خيارات المفاتيح الخارجية لـ "عند التحديث/الحذف" ولكنه كبير جدًا بالنسبة للتعليق - آمل أن يساعد.

تتالي

كلما تم حذف صفوف في الجدول الرئيسي (المشار إليه) (تم تحديثها) ، سيتم حذف صفوف الجدول التابعة (المرجعية) ذات العمود الخارجي المطابق (تم تحديثها). وهذا ما يسمى حذف تتالي (resp. update [2]).

بتقييد

لا يمكن تحديث أو حذف قيمة عند وجود صف في جدول مفاتيح خارجي يشير إلى القيمة في الجدول المشار إليه. وبالمثل ، لا يمكن حذف صف ما دام هناك مرجع إليه من جدول مفاتيح خارجي.

لا رد فعل

لا يوجد إجراء و قيود متشابهة إلى حد كبير. الفرق الرئيسي بين NO ACTION و RESTRICT هو أنه مع NO ACTION يتم التحقق من التكامل المرجعي بعد محاولة تغيير الجدول. تقوم القيود بالتحقق قبل محاولة تنفيذ عبارة UPDATE أو DELETE. يتصرف كلا الإجراءين المرجعيين في حال فشل التحقق من التكامل المرجعي: يؤدي بيان UPDATE أو DELETE إلى حدوث خطأ.

SET NULL

يتم تعيين قيم المفتاح الخارجي في الصف المرجعي إلى NULL عند تحديث أو حذف الصف المشار إليه. هذا ممكن فقط إذا كانت الأعمدة المعنية في جدول المراجع خالية. بسبب دلالات NULL ، لا يتطلب صف مرجعي مع NULLs في أعمدة المفاتيح الخارجية صفًا مرجعيًا.

الوضع الإفتراضي

على غرار SET NULL ، يتم تعيين قيم المفتاح الخارجي في الصف المرجعي على العمود الافتراضي عند تحديث أو حذف الصف المشار إليه.

80
Brett

في phpmyadmin ، يمكنك تعيين مفتاح خارجي ببساطة عن طريق واجهة المستخدم الرسومية. انقر على الجدول وانتقل إلى علامة التبويب الهيكل. العثور على عرض العلاقة على رفع الصوت عاليا من الجدول (هو مبين في الصورة أدناه).

 enter image description here

يمكنك تعيين مفتاح تزوير من مربع القائمة بالقرب من المفتاح الأساسي. (انظر الصورة أدناه). وحفظ

 enter image description here

استعلام SQL المقابلة تلقائيا ولدت وتنفيذها.

54
Nishad Up

لأولئك الجدد إلى قاعدة البيانات .... وتحتاج إلى تغيير جدول موجود. يبدو أن الكثير من الأشياء واضحة ومباشرة ، لكن هناك دائمًا شيء ما ... بين A و B.

قبل أي شيء آخر ، ألقِ نظرة على هذا .

  1. تأكد من حصولك على P_ID (معرف الأصل في كل من الجدول الأصل والجدول الفرعي).
  2. بالطبع سيتم ملؤها بالفعل في الوالد. ليس بالضرورة في الطفل بطريقة حقيقية ونهائية. على سبيل المثال ، P_ID # 3 (ربما تشير مرات عديدة في الجدول الفرعي إلى P_ID الأصلي في الجدول الأصل).
  3. انتقل إلى علامة تبويب SQL (أنا أستخدم phpMyAdmin ، يجب أن تكون متشابهة في البرامج الأخرى) وقم بهذا الأمر:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
    
  4. انقر على الجدول الفرعي ، من الهيكل ، وأخيراً على العرض العلائقي. الانتهاء من التخطيط DB الخاص بك هناك. كان هناك إجابة لطيفة قبل هذا واحد حول تتالي ، تقييد ، وما إلى ذلك بالطبع يمكن أن يتم ذلك عن طريق الأوامر ...

14
user2060451

المفتاح الخارجي يعني أن السمة غير الأولية لجدول تشير إلى السمة الأولية لآخر * في phpMyAdmin * أولاً ، ضع العمود الذي تريد تعيين المفتاح الخارجي فيه كمؤشر

ثم انقر فوق عرض العلاقة

هناك يمكنك العثور على خيارات لضبط المفتاح الخارجي

9
Shafeeq M kunjumoideen

يسمح لك InnoDB بإضافة قيد مفتاح خارجي جديد إلى جدول باستخدام ALTER TABLE:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

من ناحية أخرى ، إذا كان لدى MyISAM مزايا على InnoDB في السياق الخاص بك ، فلماذا تريد إنشاء قيود مفاتيح خارجية على الإطلاق. يمكنك التعامل مع هذا على مستوى نموذج التطبيق الخاص بك. فقط تأكد من فهرسة الأعمدة التي تريد استخدامها كمفاتيح خارجية!

7
markus

لا تنسَ أن يكون للعمودين نفس نوع البيانات.

على سبيل المثال ، إذا كان أحد الأعمدة من النوع INT والآخر من النوع tinyint ، فستحصل على الخطأ التالي:

خطأ في إنشاء مفتاح خارجي في [عمود PID] (التحقق من أنواع البيانات)

4
pouya

الخطوة 1: يجب عليك إضافة السطر: default-storage-engine = InnoDB ضمن المقطع [mysqld] من ملف config mysql (my.cnf أو my.ini اعتمادًا على نظام التشغيل الخاص بك) وإعادة تشغيل خدمة mysqld.  enter image description here

الخطوة 2: الآن عندما تقوم بإنشاء الجدول ، سترى نوع الجدول: InnoDB

 enter image description here

الخطوة 3: إنشاء جدول الأصل والطفل. افتح الآن الجدول التابع وحدد العمود U الذي ترغب في امتلاك مفتاح خارجي: حدد مفتاح الفهرس من تسمية الإجراءات كما هو موضح أدناه.

 enter image description here

الخطوة 4: الآن افتح "طريقة عرض العلاقة" في نفس الجدول الفرعي من الأسفل بالقرب من "طريقة عرض الطباعة" كما هو موضح أدناه.

 enter image description here الخطوة 5: حدد العمود U ترغب في الحصول على المفتاح الخارجي مثل تحديد العمود الأصل من القائمة المنسدلة. dbName.TableName.ColumnName

حدد القيم المناسبة لـ ON DELETE و ON UPDATE  enter image description here

3
Vinod

من وثائق MySQL الرسمية على https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :

يتطلب MySQL فهارس على مفاتيح خارجية ومفاتيح مرجعية بحيث يمكن أن تكون عمليات التحقق من المفاتيح الخارجية سريعة ولا تتطلب فحص جدول.

0
Jaime Montoya