- Използване на
INSERT IGNORE
- Използване на
REPLACE
- Използване на
INSERT ... ON DUPLICATE KEY UPDATE
MySQL предоставя редица полезни изрази, когато е необходимо да се INSERT
редове след определяне дали този ред всъщност е нов или вече съществува.
По-долу ще разгледаме трите различни метода и ще обясним плюсовете и минусите на всеки на свой ред, за да имате ясно разбиране как да конфигурирате собствените си изявления, когато предоставяте нови или потенциално съществуващи данни за INSERTION
.
Използване на INSERT IGNORE
Използване на INSERT IGNORE
ефективно кара MySQL да игнорира грешки при изпълнение при опит за изпълнение на INSERT
изявления. Това означава, че INSERT IGNORE
израз, който съдържа дублирана стойност в UNIQUE
индекс или PRIMARY KEY
полене произведе грешка, но вместо това просто ще игнорира този конкретен INSERT
командват изцяло. Очевидната цел е да се изпълни голям брой INSERT
изявления за комбинация от данни, които както вече съществуват в базата данни, така и нови данни, постъпващи в системата.
Например нашите books
таблицата може вече да съдържа няколко записа:
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)
Ако имаме голяма партида нови и съществуващи данни за INSERT
и част от тези данни съдържат съответстваща стойност за id
поле (което е UNIQUE
PRIMARY_KEY
в таблицата), като използвате основен INSERT
ще доведе до очаквана грешка:
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'
От друга страна, ако използваме INSERT IGNORE
, опитът за дублиране се игнорира и не възникват произтичащи грешки:
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)
Използване на REPLACE
В случай, че искате действително да замените редове, където INSERT
командите биха довели до грешки поради дублиране на UNIQUE
или PRIMARY KEY
стойности, както е посочено по-горе, една от опциите е да изберете REPLACE
изявление.
При издаване на REPLACE
изявление, има два възможни резултата за всяка издадена команда:
- Не е намерен съществуващ ред с данни със съвпадащи стойности и следователно стандартен
INSERT
изявлението се изпълнява. - Съвпадащ ред с данни е намерен, което води до изтриване на съществуващия ред със стандартния
DELETE
изявление, след това нормаленINSERT
се извършва след това.
Например, можем да използваме REPLACE
за да заменим съществуващия ни запис от id = 1
на В търсене на изгубено време от Марсел Пруст с Зелени яйца и шунка от д-р Сюс:
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)
Забележете, че въпреки че променихме само един ред, резултатът показва, че два редовете бяха засегнати, защото ние всъщност DELETED
съществуващия ред след това INSERTED
новия ред, за да го замените.
Повече информация относно използването на REPLACE
можете да намерите в официалната документация.
Използване на INSERT ... ON DUPLICATE KEY UPDATE
Алтернативният (и като цяло предпочитан) метод за INSERTING
в редове, които може да съдържат дублиран UNIQUE
или PRIMARY KEY
стойности е да използвате INSERT ... ON DUPLICATE KEY UPDATE
изявление и клауза.
За разлика от REPLACE
– по своята същност разрушителна команда поради DELETE
команди, които изпълнява, когато е необходимо – с помощта на INSERT ... ON DUPLICATE KEY UPDATE
е неразрушителен , тъй като той винаги ще издава само INSERT
или UPDATE
изрази, но никога DELETE
.
Например решихме, че искаме да заменим нашия id = 1
запис на Зелени яйца и шунка и го върнете обратно към оригиналния В търсене на изгубено време запишете вместо това. Следователно можем да вземем нашия оригинален INSERT
изявление и добавете новия ON DUPLICATE KEY UPDATE
клауза:
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;
Забележете, че използваме нормално UPDATE
синтаксис (но с изключение на ненужната table
име и SET
ключова дума) и присвоява само non-UNIQUE
стойности. Също така, макар и ненужно за ON DUPLICATE KEY UPDATE
метод, за да функционира правилно, ние също избрахме да използваме user variables
така че не е необходимо да указваме действителните стойности, които искаме да INSERT
или UPDATE
повече от веднъж.
В резултат на това нашият id = 1
записът беше правилно UPDATED
както се очаква:
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)
Повече информация можете да намерите в официалната документация.