2012-02-13 7 views
5

Dobra, mam pytanie, naprawdę nie problem."REPLACE INTO" versus INSERT [IF]

Mam tabelę w mojej bazie danych, dość małe, tylko 3 kolumny, ale potencjał do wzrostu. Mam dwa rozwiązania mojego problemu, ale nie wiem, dlaczego użyć jednego lub drugiego.

Mam dane, które mogą, ale nie muszą być już w bazie danych. Dwa sposoby rozwiązania tego. Mam unikalny identyfikator, więc łatwo go sprawdzić.

  1. Sprawdź, czy zapisy istnieje w bazie danych, a jeśli nie, INSERT INTO bazie
  2. Zastosowanie REPLACE INTO, bo mam już identyfikator.

Moje pytanie brzmi teraz. Którego lepiej użyć. Jakie są plusy i minusy w używaniu jednego z dwóch wyników. Czy jest lepszy wynik?

Uwaga: dane są dokładnie takie same, więc nie ma szans, że rekord zostanie zaktualizowany o nowszą wartość. Zatem REPLACE INTO wstawi dane, które już tam są. Nie jest zalecane tutaj

+10

Uważaj, 'REPLACE INTO' jest implementowane wewnętrznie jako' DELETE', a następnie 'INSERT'. Skasowanie jest zwykłym kasowaniem, co oznacza, że ​​sprawdza klucze obce i przestrzega klauzul "ON DELETE". Najprawdopodobniej * prawdopodobnie * chcesz 'INSERT INTO ... ON DUPLICATE KEY UPDATE ...'. – Charles

+0

Ale jaka jest tutaj najlepsza praktyka? I dlaczego –

+2

Dodatkowo, jeśli spróbujesz zaktualizować wiersz z tymi samymi (istniejącymi) wartościami, MySQL wykryje, że wartości są takie same i pominie aktualizację, oszczędzając czas, blokady, itp. - kolejny powód użycia 'INSERT INTO ... ON DUPLICATE KEY UPDATE ... 'versus usuwanie istniejącego wiersza w pierwszej kolejności. –

Odpowiedz

10

REPLACE INTO - nie trzeba niczego wymieniać. To robi DELETE, a następnie INSERT, z wszystkimi konsekwencjami. Na przykład wszystkie indeksy muszą być aktualizowane, co prowadzi do niepotrzebnej pracy i fragmentacji indeksu, jeśli często go używasz.

Z drugiej strony jest ON DUPLICATE KEY UPDATE, który jest używany głównie do liczników, ale nie aktualizujesz swojego wiersza przyrostami ani żadnymi innymi zmianami wartości, więc będziesz musiał użyć dziwnej składni, takiej jak SET id=id lub coś podobnego.

Sprawdzenie czy rekord w bazie danych istnieje byłoby najlepszym rozwiązaniem dla Ciebie, ale zamiast używać innej kwerendy niech mysql zrobić ten czek dla ciebie i zastosowanie:

`INSERT IGNORE INTO ...` 

ten sposób, jeśli próby wstawienia dowolny wiersz ze zduplikowanym unikalnym lub podstawowym kluczem, po prostu nie zostanie wstawiony bez generowania żadnego błędu. Zwróć uwagę na efekt uboczny prawdopodobnie braku innych komunikatów o błędach, ale jeśli wiesz dokładnie, co wstawiasz, powinno być dobrze.