2011-03-28 2 views
1

내가 두 테이블을 말한다. 특정 기사에 대한 은 한 번에 다 대다 커넥터 테이블을 업데이트

CREATE TABLE cat2art (
    article_id INT, 
    category_id INT 
); 

, 나는 카테고리 아이디의의 '새 목록'을 가지고, 우리는 다음과 cat2art 테이블을 업데이트해야합니다.

일부 카테고리가 제거되고 일부는 추가되고 일부는 원래 위치에 머물렀습니다. 이 테이블을 업데이트하는 가장 효과적인 방법은 무엇입니까?

나는 특정 article_id로 모든 레코드를 순진하게 삭제하고 다시 추가 할 수 있습니다. 그러나 기사가 범주에 연결될 때를 추적하는 동일한 테이블에 날짜를 기록하면 해당 정보가 삭제됩니다.

나는이 문제를 쉽게 해결할 수있는 훌륭한 패턴을 찾고 있습니다. 이 질문은 PHP와 MySQL을위한 것이지만 다른 언어의 답변도 PHP + MySQL에도 적용됩니다.

답변

4

다른 시스템이 정확하게 당신이 원하는 것을 할 것 MERGE 문을 지원합니다. 내가 삭제할 레코드를 나중에 알 것입니다 방법

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), 
…; 
+0

내가 찾고있는 답변에 가장 가까운이 답변을 수락했습니다. =) – Evert

2

고유 키로 (article_id, category_id)를 정의 할 수 있으며 연결을 삽입 할 때 INSERT IGNORE 구문을 사용합니다. 이렇게하면이 연결이 이미 존재하면 다시 추가되지 않으며 기존 레코드를 업데이트하지 않으며 create_date 열은 그대로 유지됩니다.

예 :

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

:

그러나, MySQL, 당신은 적어도 두 개의 쿼리를 (가 삭제 한 성명에서/업데이 트를 삽입 할 수 없습니다) 필요? – Evert

+0

@Evert - Quassoni가 제안한 것과 비슷한 삭제 쿼리를 실행해야합니다. 나는 그것이 더 도전적인 부분이라고 가정하고 삽입 문제를 다루었 다. – Galz

+0

어느 쪽도 매우 어렵지 않지만이 레코드를 삽입/업데이트/삭제하는 재사용 가능한 좋은 패턴이 필요했습니다. 나는이 작업을 여러 번 수동으로 수행하기 때문에 좋은 표준 솔루션을 기대하고 있었다. – Evert