说我有两张桌子:
articles
categories
有很多表连接它们。
CREATE TABLE cat2art (
article_id INT,
category_id INT
);
对于特定文章,我有一个类别ID的“新列表”,我们需要用这些更新cat2art表。
某些类别被删除,一些类别被添加,一些类别停留在原来的位置。更新此表的最有效方法是什么?
我可以天真地删除具有指定article_id的所有记录,然后再次添加它们。但是,如果我要在同一个表中记录一个日期,该日期跟踪文章链接到某个类别的时间,那么该信息现在将被销毁。
我正在寻找一个很容易解决这个问题的好模式。这个问题专门针对PHP和MySQL,但是其他语言的答案也很好,只要它们也适用于PHP + MySQL。
答案 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());