2011-07-30 2 views
0

항목이 있는지 확인하고 싶으면 계산 필드를 1 씩 증가시키고, 그렇지 않으면 새 항목을 만들고 계산을 1로 초기화합니다. 간단하고 충분합니까? 그러나, 나는 이것을하는 많은 방법을 우연히 발견했으며 어떤 방법이 가장 빠르지는 모르겠습니다.중복 된 항목을 빠르게 확인한 다음 새 항목을 만드는 방법은 무엇입니까?

1) 나는 기존 항목을 확인하려면이 옵션을 사용할 수 있습니다, 다음 따라 어느 갱신 또는 작성 :

if(mysql_num_rows(mysql_query("SELECT userid FROM plus_signup WHERE userid = '$userid'"))) 

2) 또는 내가 WHERE_EXISTS 사용해야

?

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=c+1; 
UPDATE table SET c=c+1 WHERE a=1; 

4) 아니면 내가 고유 키가 그럼 그냥 기다릴로 ID 열을 설정할 수 있습니다

SELECT DISTINCT store_type FROM stores 
WHERE EXISTS (SELECT * FROM cities_stores 
WHERE cities_stores.store_type = stores.store_type); 

3) 또는 항목을 삽입하려면이 옵션을 사용하여 존재하는 경우 다음을 업데이트 항목에 중복 오류가 있는지 확인하십시오. 그런 다음 해당 항목을 대신 업데이트 할 수 있습니다.

검색에 약 1 백만 개의 항목이 있습니다. 기본 키는 현재 bigint입니다. 엔트리를 검색 할 때 bigint id 필드 만 입력하면됩니다. 두 개의 엔트리가 현재 동일한 id를 가지고 있지 않으므로이 방법을 계속 사용하고 싶습니다.

편집 : 오 싹, 나는 틀린 단면도에서 이것을 창조했다. 나는 그것을 serverfault에 넣으려고했다.

+0

자동 증가 필드를 사용할 수 있습니까? –

+0

@ Vadoff : serverfault로 이동해서는 안되며 [프로그래머] (http://programmers.stackexchange.com/)에서 더 잘 맞을 것입니다.하지만 걱정할 필요가 없습니다. 여기에서도 답할 수 있습니다. – Shef

+0

@ oracle 공인 전문가 : 아니요. 자동 증가를 원하지 않습니다. – Vadoff

답변

2

나는 그것이 INDEXUNIQUE 제약 또는 설정 3.

있어 다음 그것은 더 자주 일어날 경우 따라 수 3

0

의 구문을 사용 믿습니다.

레코드가 존재하지 않는 경우 나중에 INSERT IGNORE INTO으로 가서 영향을받은 행을 확인하십시오. 이 값이 0이면 레코드가 이미 있으므로 UPDATE이 발급됩니다.

그렇지 않으면 INSERT INTO ... ON DUPLICATE KEY UPDATE으로 이동하십시오.

+0

'INSERT IGNORE'는 테이블보다 더 많은 문제를 해결합니다. – Shef

+0

설명해 주시겠습니까? – wonk0

+0

'INSERT IGNORE'는 다른 많은 이유로 인해 쿼리가 작동하지 않았지만 중복이 있었기 때문에 오류가 발생하지 않으면 결과를 알 수 없습니다. – Shef

관련 문제