mysql - 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,而在其他要更新的表上找不到它并插入数据?对于从主应用程序启动和更新的每条记录,要加载到其他表中的数据是相同的。
解决方案
在从文件加载记录之前启动事务。然后,您可以保存旧的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
查询假定其他列有适当的默认值——如果需要,您可以为它们添加显式值。
推荐阅读
- swift - 获取屏幕尺寸,无论方向如何
- swift - 斯威夫特数据()结构
- swift - 如何通过在 Swift 中拖动另一个元素来滚动 UICollectionView 而无需触摸它?
- icons - 名称中带有下划线的材料设计图标不适用于 Vuetify
- cmake - cmake,linux:作为符号链接给出的构建目录不起作用:为什么?
- neo4j - Neo4j 最接近 sql 存储函数的特性是什么?
- flutter - Flutter:从类型或字符串创建一个对象
- c - 如何使用低级(C)接口将张量保存到 TensorFlow 中的文件?
- java - 我如何比较从 csv 文件中读取的日期,以便我只计算那些帖子与那个月?
- android - 如何在 Android Studio 上导入 OR-Tools?