Обновление таблицы соединителей многие-ко-многим одновременно - PullRequest
1 голос
/ 28 марта 2011

Скажите, у меня есть две таблицы

articles
categories

Существует таблица «многие ко многим», которая их связывает.

CREATE TABLE cat2art (
  article_id INT,
  category_id INT
);

Для конкретной статьи у меня есть «новый список» идентификаторов категорий, и нам нужно обновить таблицу cat2art, указав их.

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

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

Я ищу отличный шаблон, который легко решит эту проблему. Этот вопрос специально для PHP и MySQL, но ответы на других языках также хороши при условии, что они применимы и к PHP + MySQL.

Ответы [ 2 ]

4 голосов
/ 28 марта 2011

Другие системы поддерживают оператор MERGE, который будет делать именно то, что вы хотите.

Однако в MySQL вам потребуется как минимум два запроса (его нельзя удалить и вставить / обновить в одном выражении):

DELETE
FROM    cat2art
WHERE   art_id = $art_id
        AND cat_id NOT IN ($new_cat_1, $new_cat_2, …);

INSERT
IGNORE
INTO    cat2art
VALUES
($art_id, $new_cat_1),
($art_id, $new_cat_2),
…;
2 голосов
/ 28 марта 2011

Вы можете определить (article_id, category_id) как уникальный ключ, и при вставке соединения используйте синтаксис INSERT IGNORE.Таким образом, если это соединение уже существует, оно не будет добавлено снова и не обновит существующую запись, а столбец create_date останется нетронутым.

пример:

INSERT IGNORE INTO cat2art (article_id, category_id, create_date) 
VALUES(100,200,NOW());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...