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

Jak wstawić, jeśli wiersz nie istnieje (UPSERT) w MySQL?

  • 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 normalne INSERT 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pozostałe w PostgreSQL, MS SQL Server, MySQL i SQLite

  2. Wskazówki dotyczące monitorowania MySQL dla Moodle

  3. Przykłady REGEXP MySQL

  4. Jaki jest odpowiednik ELT() w SQL Server w MySQL?

  5. Procedury składowane MySQL