SQL Найдя дубликат ключа, замените всю запись - PullRequest
2 голосов
/ 13 мая 2011

У меня есть запрос вставки для MySQL, который выглядит следующим образом:

INSERT INTO table (foo, bar, fooo, baar, etc) VALUES (?,?,?,?,?)

Он используется в скрипте для переноса некоторых столбцов и постоянно сталкивается с дублированием первичных ключей. (Старая база данных была ужасной и в плохом состоянии).

Есть ли способ, которым я могу просто сказать, чтобы заменить всю строку с ошибкой текущими значениями, полностью выбрасывая старые вещи? Я знаю, что есть команда ON DUPLICATE KEY UPDATE, но я не знаю, поможет ли она мне, поскольку все, что я видел, для этого используется увеличение.

ОТВЕТ: INSERT INTO table (foo, bar, fooo, baar, etc) VALUES (?,?,?,?,?) ON DUPLICATE KEY UPDATE foo=?, bar=?, fooo=?, baar=?, etc=?

Имейте в виду, что вам нужно снова добавить значения в ссылочный массив, чтобы учесть дополнительные вопросительные знаки.

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

on duplicate key update должно работать, как и оператор replace.

1 голос
/ 13 мая 2011

Из руководства MySQL:

Если вы зададите ON DUPLICATE KEY UPDATE, и будет вставлена ​​строка, которая приведет к дублированию значения в индексе UNIQUE или PRIMARY KEY, UPDATE старой строки будетВыполнено.

То, что вы сказали:

Есть ли способ, которым я могу просто сказать, чтобы заменить всю строку с ошибкой текущими значениями, выбрасывая старые вещи полностью?

Вывод: почему бы вам просто не попробовать?Кажется, он делает именно то, что вы хотите.


Редактировать: Поскольку вы не предоставили никаких примеров того, что вы пытались сделать, я буду использовать некоторые из веб-сайта MySQL.

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

Или если вы хотите что-то, что больше относится к реальному миру:

INSERT INTO таблица (int_field, str_field, float_field) VALUES (15, 'some string', '1.22') ON DUPLICATE KEY UPDATE int_field= 15, str_field = 'some_string', float_field = '1.22';

...