Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak mogę zrobić „wstaw, jeśli nie istnieje” w MySQL?

Użyj INSERT IGNORE INTO table .

Jest też INSERT … ON DUPLICATE KEY UPDATE składni, a wyjaśnienia można znaleźć w 13.2.6.2 Instrukcja INSERT ... ON DUPLICATE KEY UPDATE .

Wpis od bogdan.org.ua zgodnie z Bufor Google :

18 października 2007

Na początek:od najnowszego MySQL składnia przedstawiona w tytule jest niemożliwa. Istnieje jednak kilka bardzo łatwych sposobów osiągnięcia tego, co jest oczekiwane, 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 stół:

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 metadane transkrypcji z Ensemble i że z różnych powodów potok może zostać przerwany na każdym etapie wykonywania. Dlatego musimy zapewnić dwie rzeczy:

  1. powtarzalne wykonania potoku nie zniszczą naszej> bazy danych
  1. Powtarzające się egzekucje nie kończą się z powodu błędów „zduplikowanych> kluczy podstawowych”.

Metoda 1:użycie REPLACE

To bardzo proste:

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Jeśli rekord istnieje, zostanie nadpisany; jeśli jeszcze nie istnieje, zostanie stworzony. Jednak użycie tej metody nie jest wydajne w naszym przypadku:nie musimy nadpisywać 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_transscript_id” jest już obecny w bazie danych, zostanie po cichu pominięty (zignorowany). (Aby być bardziej precyzyjnym, oto cytat z podręcznika MySQL:„Jeśli użyjesz słowa kluczowego IGNORE, błędy, które pojawią się podczas wykonywania instrukcji INSERT, będą traktowane jako ostrzeżenia. Na przykład, bez IGNORE, wiersz, który powiela istniejący UNIKALNY indeks lub KLUCZ PODSTAWOWY wartość w tabeli powoduje błąd zduplikowanego klucza i instrukcja jest przerywana.”.) Jeśli rekord jeszcze nie istnieje, zostanie utworzony.

Ta druga metoda ma kilka potencjalnych słabości, w tym brak przerwania zapytania w przypadku wystąpienia jakiegokolwiek innego problemu (patrz podręcznik). Dlatego należy go używać, jeśli wcześniej testowano go bez słowa kluczowego IGNORE.

Metoda 3:użycie WSTAW… W AKTUALIZACJI ZDUPLIKOWANEGO KLUCZA:

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 obliczenie 0+0 (Geoffray sugeruje przypisanie theid=id dla silnika optymalizacji MySQL, aby zignorować tę operację). Zaletą tej metody jest to, że ignoruje ona tylko zdarzenia zduplikowanych kluczy i przerywa działanie w przypadku innych błędów.

Na koniec:ten post został zainspirowany Xaprb. Radziłbym również zapoznać się z jego drugim postem na temat pisania elastycznych zapytań SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_STORAGE_SIZE() – Znajdź rozmiar przechowywania dokumentu JSON w MySQL

  2. Test połączenia PDO

  3. Resetowanie wskaźnika tablicy w wynikach PDO

  4. PyMySQL nie może połączyć się z MySQL na hoście lokalnym

  5. Konwertuj znacznik czasu na datę w zapytaniu MySQL