2010-01-12 3 views
3

사용자는 텍스트 필드에 키워드를 입력하고 쉼표로 키를 구분할 수 있습니다.
입력이 bananas, apple, orange, pineapple 일 수 있습니다.단일 열 데이터베이스에서 중복 항목을 처리하는 방법은 무엇입니까?

내 데이터베이스에는 keyword이라는 테이블이 있으며 기본 키인 하나의 keyword 열만 있습니다.

데이터베이스에 키워드를 $myArray = expload(',', $keywords)까지 추가합니다.
그런 다음 배열을 반복하여 'INSERT INTO myTable'을 수행합니다.

키워드가 이미 존재하면 오류 메시지가 표시됩니다.

INSERT IGNORE INTO 문을 사용하여 오류 메시지를 해결할 수 있습니다. 레코드가 중복되면, IGNORE 키워드는 MySQL에 오류를 발생시키지 않고 자동으로 무시하도록합니다.

제 질문은 : 이것을하는 좋은 방법입니까? 또는 키워드가 존재하는지 먼저 확인해야합니까?
저는 두 가지 쿼리와 하나의 쿼리를 생각하고 있습니다. 그러면 서버로드에 영향을 줍니까?

답변

4

삽입 무시는 크며, 1 돌로 2 마리의 새를 죽입니다.

삽입 무시는 이론적으로 비표준 SQL이지만 여전히 유용합니다. 다른 스토리지 엔진을 사용해야하는 경우 이러한 이벤트가 발생하면 사소한 일을 해결할 수 있습니다.이 경우 코드를 미리 포트 할 필요가 없습니다.

+1

+1 "개선"사용 – mozillalives

+0

큰. 내 의심을 확인해 주셔서 감사합니다. google "ameliorate"- 관절이 뚜렷한 프로그래머에게는 익숙하지 않았습니다.) – Steven

0

INSERT IGNORE은 완벽합니다. 내가 알고있는 유일한 구문은 REPLACE INTO이지만 다른 사용 사례 (이미 존재하는 경우 행을 삭제하고 삽입합니다. 아마도 느린 것입니다)를 의미합니다.

SELECT 쿼리를 사용하면 찾고있는 행을 찾는 데 시간이 오래 걸릴 수 있으므로 두 가지 쿼리를 사용하는 것은 좋지 않습니다.

1

이 경우에는 INSERT IGNORE을 사용하는 것을 권장하지 않지만 여기에는 몇 가지 실질적인 고려 사항이 있습니다.

나는 그것을 보내기 전에 배열을 deduplicate하면 ​​훨씬 더 빠를 것이라고 생각한다. 당신이 PHP를 사용하고있는 것처럼 보입니다. array_unique()을 사용하여 중복 제거 할 수 있습니다. 이것의 장점은

을 (http://nl2.php.net/manual/en/function.array-unique.php 참조) :

  1. INSERT IGNORE 필요 없음 - 솔루션뿐만 아니라
  2. 이하 문을 생성하는 다른 데이터베이스 보낼 수있는 작은 문, 적은 문에 작동합니다 MySQL은 구문 분석 - 더 빠릅니다.
  3. 일반적인 웹 앱의 경우 데이터베이스 작업이 PHP 처리보다 느리기 때문에 해를 끼치 지 않습니다. 내가 추천 할 것입니다

또 다른 것은 하나 개의 큰 INSERT 문장과 같이 생성하는 것입니다 : 많은 사람들이이 표준 SQL 무슨 생각을

$sql = INSERT INTO tab (keyword) VALUES ('word1'), ('word2'), ... 

는 달리.이것의 장점은 하나의 왕복, 가지고있다 - 적은 오버 헤드 방법을

+0

입력 문자열에 중복이 문제가되지 않습니다. 문제는 데이터베이스에서 중복 항목을 처리하는 방법이었습니다. – Steven

+0

하지만 그는'array_unique()'에 대해 조언하고 INSERT 문 하나를 사용하여 주셔서 감사합니다. – Steven

0

그냥이에서 블라인드 샷을 복용 ... 다른 반응을보고 할 수 있습니다 :

DBMS의 시스템은 같은 옵션을 제공

당신이 언급 한 "무시"는 아마도 "무시하고"경쟁해야하는 유일한 대체 방법이기 때문에 언급 한 "확인 및 삽입"대안보다 더 나은 성능을 위해 최적화했을 것입니다 "확인 및 삽입"보다 나은 점은 "무시"로가는 것이 의미가 없음을 의미합니다. 내 경험에 비추어 볼 때, dbms가 제공하는 기능이있을 때, 거의 항상 수동으로 실행하는 것이 좋습니다. 트랜잭션의 대기 시간을 최소화하고 기껏해야 내부적으로 최적화되어 더 나은 성능 ... 그러나 다시 한 번 상황을 광범위하게 일반화 할 수 없으며 사례별로 조사해야합니다 ... 이것은 단지 지침으로 받아 들여야합니다 ...

관련 문제