首页 > 解决方案 > MYSQL LOAD DATA IN FILE 并将 LAST_INSERT_ID 和 INSERT DATA 放入另一个表

问题描述

可以这么说,我正试图用 1 块石头杀死多只鸟。我正在使用 Windows 命令行 mysql.exe 加载从我正在使用的另一个程序调用的本地 infile,我发现还有 3 个其他表需要更新,它们使用主表中的自动递增 PK。表名是 case_info、缓解和处理。case_info 中的字段名称是 case_id、client_id、sales_data、expenses_data 和income_data。缓解中的字段名称是 mit_id、client_id和缓解数据。处理中的字段名称是 proc_id、client_id和 processing_data。我传递给 cli 的命令

mysql.exe -uUSER -pSOMEPASSWORD -hEXAMPLE.COM TABLENAME  -e \"load data local infile '" +leads+ "' 
into table clients 
fields terminated by ',' 
LINES TERMINATED BY '\r\n'
(first_name,address,city,state,zip,saledate,file_id,last_updated,last_updated_by);"+ chr(34)`

client_id是 AI,PK 所以我需要在上面列出的 3 个表上运行插入语句,以在所有 3 个表上的 *_data 字段和client_id字段中插入文本,同时在加载每条记录后执行本地 infile 加载数据. 我不确定这是否可能,如果不是,有人可以帮助我制作一个查询以一次运行或在加载后运行以从客户端表中获取client_id,而在其他要更新的表上找不到它并插入数据?对于从主应用程序启动和更新的每条记录,要加载到其他表中的数据是相同的。

标签: mysqlload-data-infile

解决方案


在从文件加载记录之前启动事务。然后,您可以保存旧的MAX(client_id)并在查询中使用它,以查找在主表中创建的所有新 ID,并将它们添加到其他表中。

mysql ... -e \"
START TRANSACTION;
SET @maxid = (select max(client_id) from clients;
load data local infile '" +leads+ "' 
into table clients 
fields terminated by ',' 
LINES TERMINATED BY '\r\n'
(first_name,address,city,state,zip,saledate,file_id,last_updated,last_updated_by);
INSERT INTO case_info (client_id)
SELECT client_id FROM client
WHERE client_id > @maxid;
INSERT INTO mitigation (client_id)
SELECT client_id FROM client
WHERE client_id > @maxid;
INSERT INTO processing (client_id)
SELECT client_id FROM client
WHERE client_id > @maxid;
COMMIT
"+ chr(34)`

其他三个INSERT查询假定其他列有适当的默认值——如果需要,您可以为它们添加显式值。


推荐阅读