UPSERT в MySQL, когда НЕ используется первичный ключ - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть большой набор данных, который я хочу импортировать в свою базу данных 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

1 Ответ

0 голосов
/ 19 сентября 2018

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

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 ;
...