У меня есть большой набор данных, который я хочу импортировать в свою базу данных 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
Поскольку ваше требование не относится к первичному ключу, поэтому вам необходимо использовать процедуру:
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 ;
UPSERT
в MySQL у вас должен быть первичный или уникальный ключ. И нет способа имитировать его с обычными значениями qeuries, если вы не собираетесь использовать хранимую процедуру или это также возможно при использовании динамического SQL. (но это не сработает при импорте из другой программы)UPSERT
просто скопируйте функциональность. Например, обновление, если найдено, еще вставить.