상위 폴더에서 중복 된 파일 이름을 잡는 데 가장 효율적인 코드를 찾으려고합니다. 나는 혈통과 부모 - 자식 모델을 사용하여 MySQL 데이터베이스에 파일 트리를 저장 해요 :
1. 실행 쿼리 :MySQL의 디렉토리 트리에있는 고유 한 파일 이름
INSERT INTO filetable (name, parent_id, path_num, path_string)
SELECT '$name','$pid','$path_num','$path_string' FROM DUAL
WHERE NOT EXISTS
(SELECT name FROM filetable WHERE name='$name');
및 PHP에서
CREATE TABLE `filetable` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`parent_id` int(11) NOT NULL,
`path_num` varchar(255) NOT NULL,
`path_string` text() NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
나는 두 가지 방법을 고려하고 :
if (mysql_affected_rows() === 0) takeAction($name);
장점 : 간단한 SQL, 테이블
CONS에 행을 추가 할 필요가 없습니다 :
if (mysql_affected_rows() === 2) takeAction($name); // Yes 2 for updates
총 :
INSERT INTO filetable (name, parent_id, path_num, path_string)
VALUES ('$name','$pid','$path_num','$path_string')
ON DUPLICATE KEY UPDATE 0=0;
및 PHP에서
: UPDATE가 작은 부분에 트리거 필드와 사용에 큰 테이블에2.Creat 고유 인덱스를 눈을 얻을 수있는 더블 쿼리 name
이 중복 된 경우 쿼리 수
CONS : 테이블의 추가 행
고유 한 필드는 path_string은 파일의 전체 경로입니다. 내 파일 시스템에서는 매우 길어질 수 있기 때문에 TEXT 유형의 필드를 사용할 수 있습니다. MySQL에서는 TEXT 필드에 고유 색인을 작성할 수 없습니다. 그래서 내가 생각하고있는 것은 컬럼을 만드는 것입니다.
`problemsolver` varchar(62) = $parent_id . '_'.$name
그리고 크레타 고유 인덱스를 만드는 것입니다.
저는 이러한 쿼리가 데이터베이스에 대한 모든 쿼리의 10 %를 차지할 것으로 기대합니다.
제 질문은이 두 가지 방법 중 무엇을 사용 하시겠습니까? 그 이유는 무엇입니까? 또는 더 나은 옵션을 사용할 수 있습니까?
UNIQUE 색인 s.t. 귀하의 INSERT는 단순히 실패하고 결과를 확인합니까? –
고유 한 필드에 UNIQUE 키를 추가 한 다음 INSERT IGNORE를 사용하면 두 번째 INSERT ... ON DUPLICATE 필요 부분을 절약 할 수 있습니다. 어쨌든 어쨌든 잡는 중 오류를 찾고 있지는 않습니다 (쿼리를 다시하기 위해서가 아니라 적어도). 관련 내용 : http://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-update – DACrosby