sql >> Databáze >  >> RDS >> Mysql

Jak VLOŽIT, pokud řádek neexistuje (UPSERT) v MySQL

  • Pomocí INSERT IGNORE
  • Pomocí REPLACE
  • Pomocí INSERT ... ON DUPLICATE KEY UPDATE

MySQL poskytuje řadu užitečných příkazů, když je potřeba INSERT řádky po určení, zda je tento řádek ve skutečnosti nový nebo již existuje.

Níže prozkoumáme tři různé metody a vysvětlíme klady a zápory každé z nich, abyste měli jasnou představu o tom, jak nakonfigurovat vlastní příkazy při poskytování nových nebo potenciálně existujících dat pro INSERTION .

Pomocí INSERT IGNORE

Pomocí INSERT IGNORE efektivně způsobí, že MySQL ignoruje chyby při provádění při pokusu o provedení INSERT prohlášení. To znamená, že INSERT IGNORE příkaz, který obsahuje duplicitní hodnotu v UNIQUE index nebo PRIMARY KEY pole není způsobí chybu, ale místo toho jednoduše ignoruje konkrétní INSERT velet úplně. Zřejmým účelem je provést velké množství příkazů INSERT výpisy pro kombinaci dat, která již existují v databázi, i nová data přicházející do systému.

Například naše books tabulka již může obsahovat několik záznamů:

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)

Pokud máme velkou dávku nových a stávajících dat, INSERT a část těchto dat obsahuje odpovídající hodnotu pro id pole (což je UNIQUE PRIMARY_KEY v tabulce) pomocí základního INSERT vyvolá očekávanou chybu:

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'

Na druhou stranu, pokud použijeme INSERT IGNORE , pokus o duplikaci je ignorován a nedochází k žádným výsledným chybám:

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)

Pomocí REPLACE

V případě, že chcete skutečně nahradit řádky, kde INSERT příkazy by způsobily chyby kvůli duplicitě UNIQUE nebo PRIMARY KEY hodnoty, jak je uvedeno výše, jednou z možností je zvolit REPLACE prohlášení.

Při vydávání REPLACE existují dva možné výsledky pro každý vydaný příkaz:

  • Nebyl nalezen žádný existující řádek dat s odpovídajícími hodnotami, a tedy standardním INSERT provede se příkaz.
  • Odpovídající řádek dat je nalezen, což způsobí, že stávající řádek bude smazán standardním DELETE a poté normální INSERT se provádí následně.

Můžeme například použít REPLACE pro výměnu našeho stávajícího záznamu id = 1 z In Search of Lost Time od Marcela Prousta s zelenými vejci a šunkou od Dr. Seusse:

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)

Všimněte si, že i když jsme změnili pouze jeden řádek, výsledek ukazuje, že dva řádky byly ovlivněny, protože jsme ve skutečnosti DELETED existující řádek a poté INSERTED nový řádek, který jej nahradí.

Další informace o používání REPLACE naleznete v oficiální dokumentaci.

Pomocí INSERT ... ON DUPLICATE KEY UPDATE

Alternativní (a obecně preferovaná) metoda pro INSERTING do řádků, které mohou obsahovat duplicitní UNIQUE nebo PRIMARY KEY hodnoty je použít INSERT ... ON DUPLICATE KEY UPDATE prohlášení a doložka.

Na rozdíl od REPLACE – inherentně destruktivní příkaz kvůli DELETE příkazy, které provádí v případě potřeby – pomocí INSERT ... ON DUPLICATE KEY UPDATE je nedestruktivní , v tom, že vždy vydá pouze INSERT nebo UPDATE příkazy, ale nikdy DELETE .

Například jsme se rozhodli, že chceme nahradit naše id = 1 rekord Zelená vejce a šunka a vrátit jej zpět do původního In Search of Lost Time místo toho zaznamenejte. Můžeme tedy vzít náš původní INSERT a přidejte nový ON DUPLICATE KEY UPDATE klauzule:

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;

Všimněte si, že používáme normální UPDATE syntaxe (ale s výjimkou zbytečné table jméno a SET klíčové slovo) a pouze přiřazení non-UNIQUE hodnoty. Také, i když to není nutné pro ON DUPLICATE KEY UPDATE Aby správně fungovala, rozhodli jsme se také použít user variables takže nemusíme specifikovat skutečné hodnoty, které chceme INSERT nebo UPDATE více než jednou.

Výsledkem je, že naše id = 1 záznam byl správně UPDATED podle očekávání:

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)

Více informací naleznete v oficiální dokumentaci.


  1. Po upgradu PHP nemohu používat funkce mysql_*

  2. Vytvářejte soubory PDF pomocí PLSQL v Oracle

  3. Jak zobrazit znaky UTF-8 v phpMyAdmin?

  4. Jak nainstalovat Oracle Linux Automation Manager (aka „Oracle Ansible Tower“)