mysql批量上传-在另一个表中使用生成的主键值

时间:2019-07-01 12:31:19

标签: mysql

我正在尝试从文本文件批量上传到MySQL数据库。 首先,我将文件中的所有数据加载到临时帮助器表(temp_rules_upload)中,批量上传后将删除该表。 然后,我希望将临时表中的每条记录插入到几个选定的列的2个单独的表(table_a和table_b)中。

问题:-

  • 它首先将所有数据插入table_a,然后将所有数据插入table_b。
  • 如何控制每条记录插入到table_a之后,我想插入到table_b,因为我需要为每条记录使用table_b中table_a的主键。
  • 对于每条记录,我还需要从另一个表中查找start_material_code的主键,并将其设置在table_b中。
  • 不确定LOAD DATA是否适合此要求。我有数百万个数据要加载其他选项,例如JPA,这非常耗时

我尝试了以下脚本。由于顺序发生,我只得到了LAST_INSERT_ID()的最后一个主键

SQL脚本:-

LOAD DATA LOCAL INFILE 'rule_1.txt' 
INTO TABLE temp_rules_upload 
COLUMNS TERMINATED BY '|' 
LINES TERMINATED BY '\n' IGNORE 1 LINES
(groupname,starting_material_code,lower_limit,higher_limit,description,severity,active,created_date,created_by);

insert into table_a(active,create_date,code,description,severity) 
select true,CURDATE(),groupname,description,severity from temp_rules_upload;

SET @ERROR_ID=LAST_INSERT_ID();

insert into table_b(active,create_date,code,description,groupname,higher_limit,lower_limit,compatibility_error_id,starting_material_id) 
select true,CURDATE(),starting_material_code,description,groupname,higher_limit,lower_limit,@ERROR_ID,null from temp_rules_upload;

文件数据:(rule_1.txt)

1004 : 1964|1004|||not compatible with zzz|Error|Yes|6/20/2019|AAA
1004 : 1964|1964|||not compatible with ffff|Error|Yes|6/20/2019|AAA

1 个答案:

答案 0 :(得分:0)

我通过拆分为两个单独的任务来处理此问题。我认为不可能使用LOAD DATA LOCAL INFILE

来完成所有操作

1。加载到临时表中

  • 将数据从文本文件上载到具有与文件相同的表结构的临时表中。这非常快,只需不到10分钟即可加载全部5+百万个数据。

2。使用存储的proc将数据从temp加载到实际表中。

  • 然后使用存储过程在游标的帮助下遍历所有5+百万条记录,并将其插入到我的2个表A和B中。但是,由于这涉及存储过程中的某些逻辑,因此上载所有逻辑都需要10个小时5百万个数据。

我的代码:https://codereview.stackexchange.com/questions/223424/stored-procs-fine-tuning-for-processing-bulk-data-5-million-records