MySQL ON DUPLICATE КЛЮЧОВЕ ОНОВЛЕННЯ для декількох рядків, що вставляються в один запит


199

У мене є SQL-запит, куди я хочу вставити кілька рядків в один запит. тому я використав щось на кшталт:

$sql = "INSERT INTO beautiful (name, age)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),
  ('Samia', 22),
  ('Hui Ling', 25),
  ('Yumie', 29)";

mysql_query( $sql, $conn );

Проблема полягає в тому, що коли я виконую цей запит, я хочу перевірити, чи повинен бути перевірений UNIQUEключ (який не є PRIMARY KEY), наприклад, 'name'вище, і якщо такий 'name'вже існує, відповідний цілий рядок слід оновити інакше.

Наприклад, у наведеному нижче прикладі, якщо 'Katrina'він вже є в базі даних, весь рядок, незалежно від кількості полів, повинен бути оновлений. Знову, якщо 'Samia'немає, рядок слід вставити.

Я думав використовувати:

INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE

Ось пастка. Я застряг і розгубився, як діяти далі. У мене є кілька рядків для вставки / оновлення одночасно. Будь ласка, дайте мені вказівку. Дякую.

Відповіді:


479

Використовуйте ключове слово VALUESдля позначення нових значень (див. Документацію ).

INSERT INTO beautiful (name, age)
    VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29)
ON DUPLICATE KEY UPDATE
    age = VALUES(age),
     ...

2
Що робити, якщо нам потрібно включити операцію IF в ОНОВЛЕННЯ, яка має різні умови для кожного ряду?
логіка

2
@logic: Є кілька питань, пов’язаних із цим: пошук у StackOverflow . Якщо жоден з них не відповідає на ваше запитання, будь ласка, опублікуйте нове, в якому пояснюється саме те, що вам потрібно.
Пітер Ланг

@logic Ви знайшли рішення щодо своєї проблеми? в даний час я стикаюся з тим же питанням
Parth kharecha

Чудова пропозиція. Якщо ви хочете збільшити значення при дублюванні, додайте це після частини "НА ДУПЛІКАТИ КЛЮЧНОГО ОНОВЛЕННЯ": total = total + VALUES (total)
Phoenix

1

ВСТАВЛІТЬ В ІНФОРМАЦІЮ ... НА ДУПЛІКАТНЕ КЛЮЧЕВНЕ ОНОВЛЕННЯ працюватиме лише для MYSQL, а не для SQL Server.

для SQL-сервера спосіб обійти це спочатку оголосити тимчасову таблицю, вставити значення до цієї темп-таблиці, а потім використовувати MERGE

Подобається це:

declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);

15
Хто використовує SQL-сервер: D
Джеремі Белоло

-3

Ви можете використовувати Замінити замість ВСТАВИТИ ... НА ДУПЛІКАТИ КЛЮЧУ ОНОВЛЕННЯ.


28
Так, але за допомогою REPLACE старий рядок видаляється перед тим, як вставити новий рядок. Я хочу зберегти старий рядок для підтримки первинних ідентифікаторів.
Прашант

2
Я не усвідомлював, що збереження старого ПК є для вас якимось важливим ... Безумовно, ЗАМІНА не буде працювати в цьому випадку ...
a1ex07

4
PS: "Замінити на" вимагає як видалення, так і вставки привілеїв!
Олівер М Греч

2
і з вищезгаданих причин видалення / вставки це також значно повільніше в цих випадках.
Росс

1
Що робити, якщо ви хочете оновити кілька стовпців? Замінити оновить усіх.
imVJ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.