Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да INSERT Ако ред не съществува (UPSERT) в MySQL

  • Използване на 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)

Повече информация можете да намерите в официалната документация.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извличане на свързан списък в MySQL база данни

  2. Задълбочен поглед върху индексирането на база данни

  3. Как да получите записи за последните 15 дни в MySQL

  4. Как да прехвърля DATETIME като DATE в mysql?

  5. MySQL LIMIT клауза еквивалентна за SQL SERVER