ВСТАВКА… НА ДУПЛІКАТНІЙ КЛЮЧ (нічого не робити)


184

У мене є таблиця з унікальним ключем для двох стовпців:

CREATE  TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );

Я хочу вставити рядок у цю таблицю, але якщо ключ існує, нічого не робити! Я не хочу, щоб була створена помилка, оскільки ключі існують.

Я знаю, що є такий синтаксис:

INSERT ... ON DUPLICATE KEY UPDATE ...

але чи є щось на кшталт:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

Відповіді:


332

Так, використовувати INSERT ... ON DUPLICATE KEY UPDATE id=id(це не спровокує оновлення рядків, навіть якщо idвоно призначене для себе).

Якщо вас не хвилюють помилки (помилки конверсії, помилки зовнішнього ключа) та виснаження полів автоматичного збільшення (він збільшується, навіть якщо рядок не вставлено через повторюваний ключ), тоді використовуйте INSERT IGNORE.


5
просто додати IGNORE після ВСТАВКИ, решта синтаксису однакова?
ufk

25
@ufk: INSERT IGNORE без ON DUPLICATE KEYчастини, напр.INSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock

125
Зауважте, що INSERT IGNORE також ігнорує інші помилки, такі як помилки перетворення даних.
mjcopple

36
тому я буду використовувати НА ДУПЛІКАЦІЙНІЙ КЛЮЧОВІЙ ОНОВЛЕННІ id = id. Я хочу лише ігнорувати дублікати ключів, а не будь-яку іншу помилку.
ufk

7
Остерігайтесь, щоб INSERT IGNORE збільшував стовпчик автоматичного збільшення, навіть якщо рядок не вставлено
WorM

9

ЯК ВПРОВАДЖИТИ «Вставити, якщо не існує»?

1. REPLACE INTO

плюси:

  1. просто.

мінуси:

  1. занадто повільно.

  2. автоінкрементним ключ ЗМІНИТИ (збільшення на 1) , якщо є в'їзні матчі unique keyабо primary key, оскільки вона видаляє стару запис потім вставити нову.

2. INSERT IGNORE

плюси:

  1. просто.

мінуси:

  1. ключ автоматичного збільшення не зміниться, якщо є відповідність unique keyабоprimary key індекс автоматичного збільшення збільшиться на 1

  2. деякі інші помилки / попередження будуть ігноровані, наприклад, помилка перетворення даних.

3. INSERT ... ON DUPLICATE KEY UPDATE

плюси:

  1. Ви можете легко реалізувати функцію "збереження або оновлення" за допомогою цього

мінуси:

  1. виглядає відносно складно, якщо ви просто хочете вставити не оновлення.

  2. ключ автоматичного збільшення не зміниться, якщо є відповідність unique keyабоprimary key індекс автоматичного збільшення збільшиться на 1

4. Будь-який спосіб зупинити збільшення автоматичного збільшення ключа, якщо є відповідність запису unique key або primary key?

Як згадується в коментарі нижче від @toien: "стовпець автоматичного збільшення зробиться залежно від innodb_autoinc_lock_modeконфігурації після версії 5.1", якщо ви використовуєте innodbв якості свого двигуна, але це також впливає на одночасність, тому його потрібно добре продумати, перш ніж використовувати. Поки що я не бачу кращого рішення.


стовпець автоматичного збільшення innodb_autoinc_lock_mode
зробиться

1

Використання ON DUPLICATE KEY UPDATE ...,
мінус: тому що UPDATEвикористовує ресурси для другої дії.

Використання INSERT IGNORE ...,
мінус: MySQL не відображатиме помилок, якщо щось піде не так, тому ви не можете впоратися з помилками. Використовуйте його лише в тому випадку, якщо вас не цікавить запит.


@abdul чи є підтримка mysql, що ви тут пояснили?
Lalit Tarsariya
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.