- Korzystanie z
INSERT IGNORE
- Korzystanie z
REPLACE
- Korzystanie z
INSERT ... ON DUPLICATE KEY UPDATE
MySQL dostarcza wielu użytecznych instrukcji, gdy konieczne jest INSERT
wiersze po określenie, czy ten wiersz jest w rzeczywistości nowy, czy już istnieje.
Poniżej przeanalizujemy trzy różne metody i wyjaśnimy po kolei zalety i wady każdej z nich, aby mieć mocne pojęcie o tym, jak skonfigurować własne instrukcje podczas dostarczania nowych lub potencjalnie istniejących danych dla INSERTION
.
Korzystanie z INSERT IGNORE
Korzystanie z INSERT IGNORE
skutecznie powoduje, że MySQL ignoruje błędy wykonania podczas próby wykonania INSERT
sprawozdania. Oznacza to, że INSERT IGNORE
instrukcja, która zawiera zduplikowaną wartość w UNIQUE
index lub PRIMARY KEY
pole nie wygeneruje błąd, ale zamiast tego po prostu zignoruje ten konkretny INSERT
polecenie całkowicie. Oczywistym celem jest wykonanie dużej liczby INSERT
oświadczenia dla kombinacji danych, które już istnieją w bazie danych, a także nowych danych wchodzących do systemu.
Na przykład nasze books
tabela może zawierać już kilka rekordów:
mysql> SELECT * FROM books LIMIT 3;
+----+-------------------------+---------------------+----------------+
| id | title | author | year_published |
+----+-------------------------+---------------------+----------------+
| 1 | In Search of Lost Time | Marcel Proust | 1913 |
| 2 | Ulysses | James Joyce | 1922 |
| 3 | Don Quixote | Miguel de Cervantes | 1605 |
+----+-------------------------+---------------------+----------------+
3 rows in set (0.00 sec)
Jeśli mamy dużą partię nowych i istniejących danych do INSERT
a część tych danych zawiera pasującą wartość dla id
pole (które jest UNIQUE
PRIMARY_KEY
w tabeli), używając podstawowego INSERT
spowoduje oczekiwany błąd:
mysql> INSERT INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
Z drugiej strony, jeśli użyjemy INSERT IGNORE
, próba duplikacji jest ignorowana i nie występują żadne wynikające z niej błędy:
mysql> INSERT IGNORE INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Query OK, 0 rows affected (0.00 sec)
Korzystanie z REPLACE
W przypadku, gdy chcesz faktycznie wymienić wiersze, w których INSERT
polecenia powodowałyby błędy z powodu zduplikowanych UNIQUE
lub PRIMARY KEY
wartości, jak opisano powyżej, jedną z opcji jest wybranie REPLACE
oświadczenie.
Podczas wydawania REPLACE
oświadczenie, istnieją dwa możliwe wyniki dla każdego wydanego polecenia:
- Nie znaleziono istniejącego wiersza danych z pasującymi wartościami, a zatem standardową
INSERT
instrukcja jest wykonywana. - Pasujący wiersz danych to znaleziono, powodując, że istniejący wiersz zostanie usunięty za pomocą standardowego
DELETE
oświadczenie, a następnie normalneINSERT
jest wykonywany później.
Na przykład możemy użyć REPLACE
aby zamienić nasz istniejący rekord id = 1
z W poszukiwaniu straconego czasu Marcela Prousta z Zielonymi Jajkami i Szynką przez dr Seussa:
mysql> REPLACE INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Query OK, 2 rows affected (0.00 sec)
Zauważ, że chociaż zmieniliśmy tylko jeden wiersz, wynik wskazuje, że dwa wiersze zostały naruszone, ponieważ faktycznie DELETED
istniejący wiersz, a następnie INSERTED
nowy wiersz, aby go zastąpić.
Więcej informacji na temat używania REPLACE
można znaleźć w oficjalnej dokumentacji.
Korzystanie z INSERT ... ON DUPLICATE KEY UPDATE
Alternatywna (i ogólnie preferowana) metoda INSERTING
do wierszy, które mogą zawierać zduplikowane UNIQUE
lub PRIMARY KEY
wartościami jest użycie INSERT ... ON DUPLICATE KEY UPDATE
oświadczenie i klauzula.
W przeciwieństwie do REPLACE
– z natury destrukcyjne polecenie dzięki DELETE
komendy, które wykonuje w razie potrzeby – używając INSERT ... ON DUPLICATE KEY UPDATE
jest nieniszczący , ponieważ zawsze wyda tylko INSERT
lub UPDATE
oświadczenia, ale nigdy DELETE
.
Na przykład zdecydowaliśmy, że chcemy zastąpić nasz id = 1
zapis Zielonych Jajek i Szynki i przywróć go z powrotem do oryginalnego W poszukiwaniu straconego czasu zamiast tego nagraj. Dlatego możemy skorzystać z naszego oryginalnego INSERT
oświadczenie i dodaj nową ON DUPLICATE KEY UPDATE
klauzula:
mysql> SET @id = 1,
@title = 'In Search of Lost Time',
@author = 'Marcel Proust',
@year_published = 1913;
INSERT INTO books
(id, title, author, year_published)
VALUES
(@id, @title, @author, @year_published)
ON DUPLICATE KEY UPDATE
title = @title,
author = @author,
year_published = @year_published;
Zauważ, że używamy normalnej UPDATE
składnia (ale z wyłączeniem niepotrzebnej table
nazwa i SET
słowa kluczowego) i przypisanie tylko non-UNIQUE
wartości. Również, chociaż nie jest to konieczne w przypadku ON DUPLICATE KEY UPDATE
do poprawnego działania, zdecydowaliśmy się również na wykorzystanie user variables
więc nie musimy określać rzeczywistych wartości, które chcemy INSERT
lub UPDATE
więcej niż raz.
W rezultacie nasz id = 1
rekord został prawidłowo UPDATED
zgodnie z oczekiwaniami:
mysql> SELECT * FROM books LIMIT 1;
+----+------------------------+---------------+----------------+
| id | title | author | year_published |
+----+------------------------+---------------+----------------+
| 1 | In Search of Lost Time | Marcel Proust | 1913 |
+----+------------------------+---------------+----------------+
1 row in set (0.00 sec)
Więcej informacji można znaleźć w oficjalnej dokumentacji.