2012-06-05 2 views
0

내가 찾고있는 것은 레코드를 삽입 한 다음 더 이상 사용하지 않으므로 동일한 ID를 가진 이전 레코드를 비활성화하는 것입니다. 그러나 가능한 가장 간단한 방법으로이 작업을 수행하려고합니다. 레코드 삭제는 실제로 옵션이 아닙니다.Mysql : UPDATE 쿼리에 대한 두 조건에서 int 필드 값 전환

작업

시도 순서 : 활성 사용중 값

  1. 삽입 inUse = 1
  2. 더 이상 사용하지 않는 것과 동일한 ID에 대한 다음과 같은 기록을 업데이트 : inUse = 0

내 첫번째 생각이었다 이 쿼리를 실행하려면

UPDATE page_tags SET inUse = IF(inUse = 1, 0, 1) WHERE page_id = 23678459 AND tag_id NOT IN (10, 4);

이 쿼리의 유일한 문제는 다시 실행하면 비활성화 된 모든 값을 다시 1로 전환한다는 것입니다. 특정 ID가 WHERE에 의해 타겟팅 된 경우에만 되돌릴 수있는 모든 태그가 필요합니다. 성명서.

+1

당신은 첫 번째 쿼리 0에 inUse''무조건'update'을 할 수 'inUse = 1'을 사용하여'insert '하십시오. 이런 식으로하지 않는 이유가 있습니까? – ManieQ

+0

@ManieQ 나는 그것에 대해 생각했다. 그러나 태그가 이미 존재한다면 새로운 태그를 추가하지 않을 것이므로 기존의 태그를 사용하기 때문에 어떤 방식 으로든보고 싶다고 생각할 것이다. 그래서 그 태그를 비활성화시키지 않거나 다시 활성화시켜야합니다 ... – stwhite

답변

0

@ 존 피는 괜찮은 답변이지만, 그의 대답에는 트리거를 사용해야합니다. 제가 당면한 문제를 해결하기 위해서는 저보다 더 많은 것이 필요할 것 같습니다. 현재 작업 솔루션은 다음과 같습니다

page_tags.page_idpage_tags.tag_id상의 고유 색인을 만듭니다.

업데이트 모든 행 위치를 * 페이지 ID = 234234 * :

UPDATE page_tags SET inUse = 0 WHERE page_id = 234234 

삽입 태그 :

INSERT INTO page_tags (page_id, tag_id, inUse) VALUES (234234, 49343, 1) ON DUPLICATE KEY UPDATE inUse = 1 
1

방아쇠를당한 것처럼 들립니다. 어쩌면 그렇게 할 것인가? (의사 코드)? previuos 태그의 재사용을 처리하기위한

UPDATE :

이 삽입/업데이트를 수행

INSERT INTO ... ON DUPLICATE KEY UPDATE 

그런 다음 두 개의 트리거, 삽입 용 및 업데이트 하나를 사용하십시오.

CREATE TRIGGER tr_inuse_insert BEFORE INSERT ON page_tags 
    FOR EACH ROW BEGIN 
    UPDATE page_tags SET inuse=0 WHERE page_id = NEW.page_id; 
    END; 

CREATE TRIGGER tr_inuse_update BEFORE UPDATE ON page_tags 
    FOR EACH ROW BEGIN 
    UPDATE page_tags SET inuse=0 WHERE page_id = NEW.page_id; 
    END; 
+0

(편집 됨) John, 제안에 감사드립니다. 여기서 볼 수있는 유일한 문제는 태그가 이미있는 경우 재사용 (inUse = 1)을 위해 태그를 활성화하고 싶습니다. 중복 된 태그 ID에 대한 새로운 행을 추가 할 때 아무런 의미가 없습니다. – stwhite

+0

좋습니다. "레코드를 삽입 한 다음 이전 ID가 같은 이전 레코드를 더 이상 사용하지 않기 때문에 비활성화하는 것"보다 더 많은 기능이 있습니까? –

+0

또한 게시 된 질문의 일부는 "특정 ID가 WHERE 문으로 대상을 지정하는 경우에만 전환 할 수 있도록 모든 태그가 필요합니다." 그래서 요한은 분명히 적절한 대답이지만, 내가 간 것은 아닙니다.그 이유는 귀하의 대답에 필요한 것보다 더 많은 트리거가 필요하기 때문입니다. – stwhite