不使用主键时在MySQL中使用UPSERT

时间:2018-09-19 10:24:03

标签: mysql upsert

我有一个大数据集,想要导入到我的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 |

例如,在上表中:

1012017 不存在,所以我想将其与yeardata1,{ {1}}

data2123 确实存在,所以我想用给定的值更新2017data1,其中{{1 }}

1 个答案:

答案 0 :(得分: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 ;