كيف أحذف column معرف ك Foreign key

AbuOmarHussein

السلام عليكم ورحمة الله

عملت قاعدة البيانات التالية:

وغلطت أريد حذف ال emp_id المعرف في branch table foreign key لكن يرفض يعطيني الخطاء التالي:

Error Code: 1553. Cannot drop index needed in a foreign key constraint

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

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

عليك بالبحث عن جميع الصفوف في جدول branch التي تحتوي على قيم في عمود emp_id من خلال استعلام:

SELECT *
FROM branch
WHERE emp_id IS NOT NULL;
  1. ثم حذف جميع الصفوف التي تم العثور عليها في الخطوة 1 من خلال:
DELETE FROM branch
WHERE emp_id IS NOT NULL;

وبعد حذف جميع الصفوف، تستطيع حذف عمود emp_id من جدول branch كالتالي:

ALTER TABLE branch
DROP COLUMN emp_id;

وإن كنت لا ترغب في حذف جميع الصفوف في جدول branch، فميكنك إزالة القيد الخارجي من جدول branch من خلال:

ALTER TABLE branch
DROP FOREIGN KEY fk_branch_emp_id;

ظهرت لي هذه الرسالة:

error code: 1828. cannot drop column 'emp_id': needed in a foreign key constraint 'branch_ibfk_1'

قبل حذف العمود "emp_id"، يجب عليك إزالة القاعدة الخارجية التي تشير إلى هذا العمود باستخدام الأمر ALTER TABLE كما يلي:

ALTER TABLE branch
DROP FOREIGN KEY branch_ibfk_1;

بعد إزالة القاعدة الخارجية، قم بحذف العمود "emp_id" باستخدام الأمر ALTER TABLE أيضًا:

ALTER TABLE branch
DROP COLUMN emp_id;

شكرا تم حل المشكلة 🎉

السبب في هذا الخطأ هو أن عمود emp_id في جدول branch يُستخدم كقيد خارجي على جدول employee. هذا يعني أن هناك صفوفًا في جدول branch تشير إلى صفوف في جدول employee.

أعتقد أنه يمكنك حذف عمود emp_id من جدول branch، ولكن يجب عليك أولاً إزالة القيد الخارجي من جدول employee. يمكنك القيام بذلك باستخدام عبارة ALTER TABLE كما يلي:

ALTER TABLE employee
DROP FOREIGN KEY fk_employee_branch;

بعد إزالة القيد الخارجي، يمكنك حذف عمود emp_id من جدول branch باستخدام عبارة ALTER TABLE كما يلي:

ALTER TABLE branch
DROP COLUMN emp_id;