2010-02-07 4 views
1

인덱스 테이블이 있습니다. (태그에 ID를 연결).SQL : 몇 개의 레코드로 대체하십시오 (mysql)

REPLACE INTO com_index (word, ids) VALUES ('word1', concat(ids, ' 2')), ('word2', concat(ids, ' 2')) 

word은 기본 키입니다.

행을 살펴보고 존재하는 'ids'에 '2'를 추가하십시오. 그렇지 않으면 '2'를 사용하여 새 행을 만듭니다.

그래서 단어 열 (word1 또는 word2 ...)이있는 행이 있는지, 제목에 '2'가 연결되어 있는지 확인해야합니다. 그리고 그러한 행이 없다면 (word 열과 함께) - ids = '2'로 생성하십시오.

그리고 MySQL입니다. (sub_selects가 없음)

+0

으로 해결할 수있는 문제의 배경이 약간 있다고 생각합니다. 입력과 출력 예제가 도움이 될 것입니다. –

+0

아이디어가 있습니다. INSERT는 모든 단어를 무시합니다. 그리고 나서 모두 UPDATE. –

+0

약간의 중재 : MySQL은 버전 4.1 이후 subselects를 지원합니다. –

답변

1

아주 간단한 해결책 word 기본 키 * 때문에 :

INSERT INTO `com_index` (word, ids) 
VALUES ('word1', '2'), ('word2', '2') 
ON DUPLICATE KEY UPDATE ids=concat(ids, ' 2') 

하면이 MySQL Manual for the INSERT ... ON syntax


* 실제로, 그것은 다른 종류도 가능 확인해야합니다은 인덱스가 고유 한 경우 (기본 키

+0

고마워,이게이 문제의 최선의 해결책 인 것 같아. –

0

replace into 전체 행을 삽입하거나 업데이트합니다. 열의 현재 값에 따라 업데이트를 수행하는 데 사용할 수 있다고 생각하지 않습니다. 당신이 볼 수 있듯이 열이 까다로운 빨리 얻을 수있는리스트를 저장,

UPDATE com_index SET ids = concat(ids,' 2') 
    WHERE word = 'word1' 
    AND ids <> '2'   -- Only 2 
    AND ids not like '2 %' -- Starts with 2 
    AND ids not like '% 2 %' -- 2 in the middle 
    AND ids not like '% 2'; -- 2 at the end 
INSERT INTO com_index (word, ids) 
    SELECT 'word1', '2' 
    FROM dual 
    WHERE NOT EXISTS (select * from com_index where word = 'word1'); 

:

당신처럼, 두 문장에서 그것을 할 수 있습니다. com_index 테이블을 외래 키 관계가있는 두 개의 테이블로 분리하는 것을 고려하십시오. 수

+0

나를 잘못 이해했습니다. 나는 '존재하는 그들 안에있는 것'을 의미한다 - 전혀 존재하지 않는다. 그래서,'word' 열 ('word1' 또는'word2' ...)이있는 행이 있는지 살펴보고 concat에 'ids'를 추가하십시오. 그런 행이 없다면 그것을 만드십시오. –

+0

그리고 MySQL입니다! (하위 선택이 없음) –

+0

이것이이 코드의 기능입니다. 행이 있으면 수정하고, 존재하지 않으면 행을 작성합니다. '2'를 확인하지 않아도되는 경우, AND로 시작하는 네 줄을 대답 ( – Andomar

관련 문제