У меня проблемы с добавлением составного первичного ключа к существующей таблице. Добавление ПК работает, но удалить его во время миграции не удается.
У меня есть таблица users_companies, соединяющая таблицу users и таблицу companies. Таблица users_companies
состоит из двух столбцов, userId и companyId, оба, конечно, являются внешними ключами. Моя проблема в том, что нет первичного ключа для этой таблицы. Когда я добавляю первичный ключ, используя ALTER TABLE users_companies ADD PRIMARY KEY(userId, companyId)
, кажется, все работает нормально. Но, как только я пытаюсь отменить этот первичный ключ (для отката миграции), я получаю следующую ошибку:
Ошибка при переименовании './db_name/#sql-1_9' в
'./db_name/users_companies' (errno: 150 - ограничение внешнего ключа
неправильно сформировано)
Это означает, что я не могу удалить PK для отката миграции.
Через некоторое время я заметил, что добавление этого первичного ключа удаляет индекс fk users_companies.userId
. Добавление этого индекса вручную снова заставляет PK сбрасывать работу снова. Тем не менее, этот индекс не всегда удаляется при создании первичного ключа (это зависит от базы данных, которую я использую), поэтому я не могу просто воссоздать индекс после добавления PK. Если я копирую текущую базу данных с данными в ней и пытаюсь запустить миграцию, индекс не удаляется, и я получаю сообщение об ошибке, что пытаюсь добавить индекс, который уже существует. Но в тестовой базе данных, которая заново создается для каждого запуска теста и является пустой (содержит только некоторые начальные данные), индекс удаляется.
Итак, я не могу удалить PK после его создания, пока я не воссоздаю индекс, но я не могу добавить восстановление индекса в миграцию, так как он не всегда удаляется.
Я полагаю, что здесь что-то серьезно не так, поэтому добавление индекса, если оно отсутствует, это просто обходной путь, который не устраняет существующую проблему здесь.