2007 년 10 월 18 일
시작하려면 : 최신 MySQL부터는 제목에 표시된 구문이 불가능합니다. 그러나 기존 기능을 사용하여 예상되는 것을 달성하는 매우 쉬운 방법이 몇 가지 있습니다.
중복 키 업데이트에 INSERT IGNORE, REPLACE 또는 INSERT…
테이블이 있다고 상상해보십시오.
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
이제 Ensembl에서 자동 메타 데이터 가져 오기 스크립트 메타 데이터를 파이프 라인에 가져오고 여러 가지 이유로 파이프 라인이 실행 단계에서 중단 될 수 있다고 상상해보십시오. 따라서 우리는 두 가지를 보장해야합니다.
파이프 라인을 반복해서 실행해도 데이터베이스가 손상되지 않습니다
'중복 키'오류로 인해 반복 된 실행이 종료되지 않습니다.
방법 1 : REPLACE 사용
매우 간단합니다.
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
레코드가 있으면 덮어 씁니다. 아직 존재하지 않으면 작성됩니다. 그러나이 방법을 사용하는 것은 효율적이지 않습니다. 기존 레코드를 덮어 쓸 필요가 없으며 그냥 건너 뛰는 것이 좋습니다.
방법 2 : INSERT IGNORE 사용하기 매우 간단합니다.
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
여기서 'ensembl_transcript_id'가 데이터베이스에 이미 존재하면 자동으로 건너 뜁니다 (무시). (더 정확하게 말하면, MySQL 참조 매뉴얼에서 인용 한 내용은 다음과 같습니다.“IGNORE 키워드를 사용하는 경우 INSERT 문을 실행하는 동안 발생하는 오류는 대신 경고로 처리됩니다. 예를 들어 IGNORE가 없으면 기존 UNIQUE 인덱스를 복제하는 행 또는 테이블의 PRIMARY KEY 값으로 인해 중복 키 오류가 발생하고 명령문이 중단됩니다.”) 레코드가 아직 없으면 레코드가 작성됩니다.
이 두 번째 방법에는 다른 문제가 발생할 경우 쿼리 중단을 포함하여 여러 가지 잠재적 약점이 있습니다 (설명서 참조). 따라서 이전에 IGNORE 키워드없이 테스트 한 경우 사용해야합니다.
방법 3 : INSERT… ON DUPLICATE KEY UPDATE 사용 :
세 번째 옵션은 INSERT … ON DUPLICATE KEY UPDATE
구문 을 사용 하는 것이며, UPDATE 부분에서는 0 + 0 계산과 같이 의미없는 (빈) 작업을 수행하지 않습니다 (Geoffray는이 작업을 무시하기 위해 MySQL 최적화 엔진에 id = id 할당을 제안합니다). 이 방법의 장점은 중복 키 이벤트 만 무시하고 다른 오류로 인해 중단된다는 것입니다.
마지막 공지 :이 게시물은 Xaprb에서 영감을 받았습니다. 또한 유연한 SQL 쿼리 작성에 대한 다른 게시물을 참조하는 것이 좋습니다.