一次更新多对多连接器表

时间:2011-03-28 11:57:01

标签: php mysql many-to-many relational-database

说我有两张桌子:

articles
categories

有很多表连接它们。

CREATE TABLE cat2art (
  article_id INT,
  category_id INT
);

对于特定文章,我有一个类别ID的“新列表”,我们需要用这些更新cat2art表。

某些类别被删除,一些类别被添加,一些类别停留在原来的位置。更新此表的最有效方法是什么?

我可以天真地删除具有指定article_id的所有记录,然后再次添加它们。但是,如果我要在同一个表中记录一个日期,该日期跟踪文章链接到某个类别的时间,那么该信息现在将被销毁。

我正在寻找一个很容易解决这个问题的好模式。这个问题专门针对PHP和MySQL,但是其他语言的答案也很好,只要它们也适用于PHP + MySQL。

2 个答案:

答案 0 :(得分:4)

其他系统支持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),
…;

答案 1 :(得分:2)

您可以将(article_id,category_id)定义为唯一键,并在插入连接时使用INSERT IGNORE语法。这样,如果此连接已存在,则不会再次添加,也不会更新现有记录,并且create_date列保持不变。

示例:

INSERT IGNORE INTO cat2art (article_id, category_id, create_date) 
VALUES(100,200,NOW());