سؤال

create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,primary key(a,b));

و

create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,unique (a,b));

هل هناك أي فرق وظيفي؟

هل كانت مفيدة؟

المحلول

القي نظرة على الفرق بين الفهرس الفريد والمفتاح الأساسي في MySQL

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

نصائح أخرى

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

هل هناك أي فرق وظيفي؟

بشكل عام الفرق بين أ primary key و unique القيد هو أنه يمكنك إنشاء واحد الأخير على أعمدة لاغية. أي أنه يمكنك إنشاء مفتاح أساسي على columsn لم يتم الإعلان عنه صراحة NOT NULL, ، ولكن هذه ستصبح تلقائيًا غير قابلة للفرق نتيجة لإضافة المفتاح الأساسي. أيضًا ، يمكنك الحصول على مفتاح أساسي واحد فقط ، ولكن العديد من القيود الفريدة.

الآن ، في رمز العينة الخاص بك ، كلا العمودين NOT NULL على أي حال ، لذلك لن يكون هناك أي فرق بين primary key و ال unique قيد. لكن هذا الغياب الواضح للفرق ينطبق فقط على الخواص المنطقية والعلائقية للجدول. قد لا تزال هناك اختلافات على مستوى محرك التخزين.

على سبيل المثال ، يستخدم محرك تخزين InNODB الفهارس المجمعة: يتم تخزين بيانات الجدول في العقد الورقية من الفهرس التي تم إنشاؤها للمفتاح الأساسي. لذا ، إذا كان لديك جدول InnoDB بدون مفتاح أساسي ، فسيظل InnoDB إنشاء واحد تحت الأغطية ، وسيشير فهرسك الفريد إلى الدخول في المفتاح الأساسي. تقوم المحركات الأخرى مثل NDB Cluster Engine تلقائيًا بإنشاء مفتاح أساسي إذا لم تقم بتحديده بشكل صريح ، وفي هذه الحالة أيضًا ، ستشير أي فهارس ثانوية مثل فهرسك الفريد إلى الدخول في المفتاح الأساسي. في كلتا الحالتين ، ستكون هذه الفهارس الثانوية أبطأ بشكل عام من الوقت الذي كانت قد تم تعريفه على أنه مفتاح أساسي في المقام الأول.

في MySQL ، هناك اختلاف آخر يتعلق بالمفتاح الأساسي والقيود الفريدة. إذا كنت تريد إنشاء و auto_increment يجب أن يكون العمود من هذا العمود جزءًا من المفتاح الأساسي (وعادة ما يكون المفتاح الأساسي يتكون من auto_increment عمود)

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

المفاتيح الأساسية مثل الفهارس الفريدة باستثناء:

  • لا يمكن أن تحتوي على أعمدة لاغية
  • تعاملها بعض محركات التخزين بشكل مختلف - Innodb ، على سبيل المثال ، تجمع المفتاح الأساسي ، والذي قد يكون في بعض الأحيان أمرًا جيدًا ، وأحيانًا يكون أمرًا سيئًا ، ولكن في الغالب لا يهم.

نظرًا لأنه لا يمكن أن يكون لديهم خام ، يجب على المفتاح الأساسي تحديد صف فريد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top