不使用主键时在mysql中upsert

du7egjpx  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(397)

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

avkwfej4

avkwfej41#

由于您的要求不在主键上,因此需要使用以下步骤:

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 ;

相关问题