UPSERT в MySQL, когда НЕ используется первичный ключ

0

У меня есть большой набор данных, который я хочу импортировать в свою базу данных MySQL (используя Workbench или Sequel Pro).

Проблема в том, что некоторые строки уже существуют, и я не хочу их дублировать.

Моя структура таблицы похожа на

| uid  | year | data1 | data2 |
|------|------|-------|-------|
| 123  | 2017 | 12345 | abcde |
| 124  | 2017 | 23453 | abdfe |
| 124  | 2016 | 23413 | agrfe |
| 123  | 2016 | 12325 | addde |
| 101  | 2016 | 12325 | adddf |
| 112  | 2017 | 12366 | fgdsd |
| 146  | 2016 | 11111 | adddj |

Например, в таблице выше:

101, 2017 не существует, поэтому я хотел бы вставить его вместе с year и data1, data2

123, 2017 существует, поэтому я хочу обновить data1, data2 с заданными значениями, где year = 2017

  • 0
    Короткий ответ невозможен. Для UPSERT в MySQL у вас должен быть первичный или уникальный ключ. И нет способа имитировать его с обычными значениями qeuries, если вы не собираетесь использовать хранимую процедуру или это также возможно при использовании динамического SQL. (но это не сработает при импорте из другой программы)
  • 0
    Не нужно специально использовать UPSERT просто скопируйте функциональность. Например, обновление, если найдено, еще вставить.
Показать ещё 1 комментарий
Теги:
upsert

1 ответ

0

Поскольку ваше требование не относится к первичному ключу, поэтому вам необходимо использовать процедуру:

DROP PROCEDURE IF EXISTS myUpsert;
DELIMITER |
CREATE PROCEDURE myUpsert (IN vuid INT, IN vyear INT, IN vdata1 INT, IN vdata2 varchar(20))        
BEGIN
DECLARE existingCounter INT;
  SET existingCounter = (SELECT COUNT(*) from tablename
  WHERE uid=vuid  AND year=vyear);

IF existingCounter=0 THEN
 INSERT INTO tablename (uid,year,data1,data2) 
 VALUES (vuid,vyear,vdata1,vdata2);
ELSE
 UPDATE tablename SET data1=vdata1,data2=vdata2
 WHERE uid=vuid AND year=vyear;
 END IF;
END
|
DELIMITER ;
  • 1
    «У меня большой набор данных, который я хочу импортировать в свою базу данных MySQL (используя Workbench или Sequel Pro)». С этим SP означает, что он собирается сделать это руководство
  • 0
    оппс - тогда не получится
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню