Как лучше всего в SQL поменять направление отношения один-ко-многим? - PullRequest
2 голосов
/ 10 сентября 2010

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

Таблица images содержит три элемента информации target_id, target_type и target_column, которые идентифицируют ее с любым количеством таблиц содержимого. target_type просто ссылается на имя таблицы части содержимого, связанной с изображением. target_column - это имя виртуального столбца (которого нет в таблице содержимого), который используется для поиска изображения. Это позволяет любому произвольному фрагменту контента иметь несколько связанных изображений, каждое из которых имеет свое имя.

Если у вас есть фрагмент контента и вы хотите найти, какое изображение связано с определенным именем, вы делаете

select * from images where target_id = content.id 
    and target_type = "content" 
    and target_column = "image";

Все эти фрагменты информации доступны, когда у вас есть ссылка на определенный фрагмент контента.

Вместо этого я хочу ОБРАТИТЬ все это, чтобы таблица изображений ничего не знала о конкретных частях контента, которые на него ссылаются, и вместо этого эту нагрузку несет каждая из таблиц контента.

Пока я знаю, что могу добавить столбец в таблицу содержимого, а затем выбрать нужную информацию из таблицы изображений:

select id, target_id from images where target_type = "content";

Что я хочу сделать, это использовать это как подзапрос и выполнить массовое обновление таблицы содержимого. Возможно ли что-то подобное?

update content set image_id = 
    (select id from images where target_type = "content") as image_ids where id =
    (select target_id from images where target_type = "content") as content_ids;

Я знаю, что это не удалось, но я хочу сделать какое-то массовое присвоение target_ids обратно image_ids. Это безумие? Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 10 сентября 2010

Вы можете использовать механизм обновления нескольких таблиц Mysql.(ср http://dev.mysql.com/doc/refman/5.0/en/update.html)

в вашем случае это будет

update
    content,
    images
set
    content.image_id = images.id
where
    images.target_id = content.id
    and images.target_type = 'content'
    and images.target_column = 'images'

Надеюсь, это поможет вам

Джером Вагнер

1 голос
/ 10 сентября 2010

Вы можете присоединиться к таблице изображений для обновления:

update content inner join images on images.target_id = content.id and 
    images.target_type = 'content' and images.target_column = 'images'
set content.image_id = images.id
...