Как сопоставить данные между таблицами, когда они связаны внешним ключом в mysql?

#mysql #sql

#mysql #sql

Вопрос:

У меня есть таблица ресурсов, которая содержит ресурсы, такие как тематические исследования, технические документы, вебинары и т.д.

Он имеет отношение один ко многим с другой таблицей case_study_blocks. Итак, в таблице case_study_blocks есть внешний ключ caseStudyId, который указывает на тематические исследования в таблице ресурсов.

Я хочу переместить все тематические исследования в отдельную таблицу case_studies, но для этого мне также придется обновить ссылку на внешний ключ в таблице case_study_blocks и сделать так, чтобы все записи там указывали на недавно сгенерированные уникальные идентификаторы в таблице case_study.

Каков правильный способ переноса полных данных при сохранении взаимосвязи?

Один из способов, который я могу придумать:

  • Удалите ограничение внешнего ключа для case_study_blocks
  • Добавьте новое ограничение внешнего ключа в столбец caseStudyId, указывающее на столбец id в таблице case_studies
  • Но теперь, как мне правильно сопоставить существующие case_study_blocks с новыми идентификаторами в таблице case_studies?

Ответ №1:

Выполните следующие действия:

  • Скопируйте соответствующие данные (относящиеся к тематическим исследованиям) в новую case_studies таблицу, включая исходное значение ID, которое можно было бы вызвать oldCaseStudyId , чтобы case_studies таблица имела вновь сгенерированный ID ( caseStudyId ) и исходный ID в отдельном oldCaseStudyId столбце. Последнее можно удалить, когда все будет сделано.
  • Удалите существующее ограничение внешнего ключа на case_study_blocks.caseStudyId
  • Выполните обновление caseStudyId значений с помощью сопоставления, которое теперь доступно в case_studies (оно имеет как старые, так и новые значения идентификатора). Оператор SQL может выглядеть примерно так:
     update case_study_blocks
    inner join case_studies on case_studies.oldCaseStudyId = case_study_blocks.caseStudyId
    set case_study_blocks.caseStudyId = case_studies.caseStudyId;  
     
  • Создайте ограничение замены внешнего ключа на case_study_blocks.caseStudyId
  • Удалите исходные строки из resources тех, которые относятся к тематическим исследованиям
  • Удалите столбец case_study_blocks.oldCaseStudyId