- 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.