إذا كنت تتعامل مع الخطأ: "انتهاك قيد التكامل: لا يمكن إضافة أو تحديث صف فرعي: فشل قيد المفتاح الخارجي"، فأنت في المقالة الصحيحة.
عادةً ما تواجه هذا الخطأ عند إضافة عمود جديد إلى جدول وإعلانه كمفتاح خارجي.
في قاعدة بيانات SQL، المفتاح الخارجي هو حقل في جدول يستخدم لإنشاء رابط بين البيانات في جدول آخر. خذ بعين الاعتبار جدول العملاء أدناه.
CREATE TABLE customers ( id INT PRIMARY KEY, name VARCHAR(255), email VARCHAR(255) );
الآن تريد ربط عملائك بمجموعة. عليك أولاً إضافة العمود الجديد إلى جدول العملاء الذي يحتوي على المرجع إلى جدول المجموعات:
# Create the new column "group_id" ALTER TABLE customers ADD COLUMN group_id INT NOT NULL;
يمكنك إضافة قيد المفتاح الخارجي لتنشيط العلاقة بجدول المجموعات:
# Add the FK constraints ALTER TABLE customers ADD CONSTRAINT fk_group_id FOREIGN KEY (group_id) REFERENCES customers(id);
عند تشغيل عملية التغيير هذه على جدول العملاء، ستتحقق قاعدة البيانات من وجود المعرف الموجود في حقل معرف المجموعة في جدول المجموعات.
أثناء هذا الفحص، ستثير قاعدة البيانات "خطأ انتهاك التكامل" لأن العمود group_id لا يزال فارغًا، لذلك لا يحتوي على أي مراجع صالحة في جدول المجموعات. لذلك يفشل محرك SQL في محاولة تطبيق قيد المفتاح الخارجي. ذلك لأن القيمة الفارغة ليست مفتاحًا خارجيًا صالحًا لجدول المجموعات.
الإجراء الأكثر بساطة هو إعلان العمود الجديد على أنه لاغٍ.
يمكنك إزالة التعليمة "NOT NULL" من الاستعلام البديل للسماح لعمود group_id بأن يحتوي على قيم فارغة.
سيؤدي هذا التغيير البسيط إلى حل المشكلة في المقام الأول، لأن المفتاح الخارجي يمكن أن يكون فارغًا أيضًا. يمكنك تشغيل ترحيل البيانات لملء العمود group_id الجديد في جدول العملاء، والتخطيط لإصدار جديد لإعادة تقديم القيد "NOT NULL".
إذا كان العميل في التطبيق الخاص بك لا يمكن أن يوجد بدون مجموعة معينة، فيجب أن تتذكر أن وجود معرف المجموعة لاغٍ، فإن قاعدة البيانات الخاصة بك ليست على علم بهذا القيد.
إذا ارتكبت خطأ أثناء إنشاء الكيان في تطبيقك، فلن تنبهك قاعدة البيانات.
الحل الآخر هو إضافة مهمة ترحيل البيانات بين الاستعلام البديل لإضافة العمود الجديد والاستعلام الخاص بإضافة المفتاح الخارجي.
بمجرد حصولك على عمود group_id الجديد في جدول العملاء، يمكنك تشغيل برنامج نصي لملء هذا العمود للصفوف الموجودة بمعرف صالح من جدول المجموعات.
هذا مثال للاستعلام لتنفيذ هذه المهمة:
UPDATE customers, groups SET customers.group_id = groups.id Where customers.user_id = groups.user_id;
في التطبيقات الحديثة يتم تنفيذ كافة هذه المهام باستخدام أداة الترحيل. وهو متوفر عادةً في أطر تطوير التطبيقات الأكثر شيوعًا.
في المثال أدناه، سأوضح لك كيفية التعامل مع مشكلة انتهاك قيد التكامل باستخدام عمليات الترحيل Laravel.
إنشاء الترحيل:
php artisan make:migration add_goup_id_fk_to_customers –table=customers
يمكنك تقسيم الترحيل إلى قسمين كما هو موضح أدناه:
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::create('customers', function (Blueprint $table) { $table->unsignedBigInteger('group_id')->nullable(); }); // Insert default data into the new column DB::raw('UPDATE customers, groups SET customers.group_id = groups.id WHERE customers.user_id = groups.user_id'); Schema::table('customers', function (Blueprint $table) { // Add the FK constraint $table->foreign('group_id')->references('id')->on(groups)->onDelete('cascade'); // Remove the nullable condition eventually; $table->unsignedBigInteger('group_id')->change(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::table('customers', function (Blueprint $table) { $table->dropForeign('group_id'); $table->dropColumn('group_id'); }); } };
إذا كنت مهتمًا بتحسين أداء قاعدة البيانات، فيمكنك إلقاء نظرة على المقالة أدناه حول "استعلامات قاعدة البيانات الذكية":
https://inspector.dev/how-to-accelerate-application-performance-with-smart-sql-queries/
Inspector عبارة عن أداة لمراقبة تنفيذ التعليمات البرمجية مصممة خصيصًا لمطوري البرامج. لا تحتاج إلى تثبيت أي شيء على مستوى الخادم، فقط قم بتثبيت حزمة الملحن وستكون جاهزًا للبدء.
على عكس الأنظمة الأساسية المعقدة الأخرى، فإن Inspector سهل للغاية، وصديق PHP. يمكنك تجربة حزمة Laravel أو Symfony الخاصة بنا.
إذا كنت تبحث عن أتمتة فعالة ورؤى عميقة والقدرة على إعادة توجيه التنبيهات والإشعارات إلى بيئة المراسلة الخاصة بك، فجرب Inspector مجانًا. سجل حسابك.
أو تعرف على المزيد على الموقع: https://inspector.dev
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3