18 października 2007 r
Na początek: od najnowszej wersji MySQL składnia przedstawiona w tytule nie jest możliwa. Ale istnieje kilka bardzo łatwych sposobów na osiągnięcie tego, czego się oczekuje przy użyciu istniejącej funkcjonalności.
Istnieją 3 możliwe rozwiązania: użycie INSERT IGNORE, REPLACE lub INSERT… ON DUPLICATE KEY UPDATE.
Wyobraź sobie, że mamy stolik:
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;
Teraz wyobraź sobie, że mamy automatyczny potok importujący transkrypty metadane z Ensembl i że z różnych powodów potok może być zepsuty na każdym etapie wykonywania. Dlatego musimy zapewnić dwie rzeczy:
wielokrotne wykonywanie potoku nie zniszczy naszej bazy danych
powtarzające się wykonania nie umrą z powodu błędów „duplikowania klucza podstawowego”.
Metoda 1: użycie WYMIANY
To jest bardzo proste:
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Jeśli rekord istnieje, zostanie zastąpiony; jeśli jeszcze nie istnieje, zostanie utworzony. Jednak użycie tej metody nie jest skuteczne w naszym przypadku: nie musimy zastępować istniejących rekordów, wystarczy je pominąć.
Metoda 2: użycie INSERT IGNORE Również bardzo proste:
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Tutaj, jeśli „ensembl_transcript_id” jest już obecny w bazie danych, zostanie po cichu pominięty (zignorowany). (Mówiąc ściślej, cytat z podręcznika MySQL: „Jeśli używasz słowa kluczowego IGNORE, błędy występujące podczas wykonywania instrukcji INSERT są traktowane jako ostrzeżenia. Na przykład bez IGNORE wiersz, który powiela istniejący indeks UNIQUE lub wartość KLUCZ PODSTAWOWY w tabeli powoduje błąd duplikatu klucza, a instrukcja jest przerywana. ”.) Jeśli rekord jeszcze nie istnieje, zostanie utworzony.
Ta druga metoda ma kilka potencjalnych słabości, w tym brak przerywania zapytania w przypadku wystąpienia innego problemu (patrz instrukcja). Dlatego należy go używać, jeśli był wcześniej testowany bez słowa kluczowego IGNORE.
Metoda 3: użycie WSTAWIANIA… W DUPLIKACJI AKTUALIZACJI KLUCZOWEJ
Trzecią opcją jest użycie INSERT … ON DUPLICATE KEY UPDATE
składni, aw części UPDATE po prostu nic nie rób jakiejś bezsensownej (pustej) operacji, takiej jak obliczanie 0 + 0 (Geoffray sugeruje wykonanie przypisania id = id dla silnika optymalizacji MySQL, aby zignorować tę operację). Zaletą tej metody jest to, że ignoruje tylko zduplikowane kluczowe zdarzenia i nadal przerywa inne błędy.
W ostateczności: ten post został zainspirowany przez Xaprb. Radzę też skonsultować jego drugi post na temat pisania elastycznych zapytań SQL.