MYSQL 在文件中加载数据并获取 LAST_INSERT_ID 并将数据插入另一个 table

MYSQL LOAD DATA IN FILE and get LAST_INSERT_ID and INSERT DATA into Another table

可以这么说,我正试图用 1 块石头杀死多只鸟。我正在使用 windows 命令行 mysql.exe 加载从我正在使用的另一个程序调用的本地文件,我发现还有 3 个其他 table 需要更新,它们使用从主 table 自动递增 PK。 table 名称是 case_info、缓解和处理。 case_info 中的字段名称是 case_id、client_id、sales_data、expenses_data 和 income_data。缓解中的字段名称是 mit_id、client_id 和 mitigation_data。 正在处理的字段名称是 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个table上插入语句来插入在所有 3 tables 上的 *_data 字段和 client_id 字段中输入文本,同时在加载每条记录后执行加载数据本地文件。我不确定这是否可能,如果不能,有人可以帮我一次查询 运行 或在加载后查询 运行 以获得 client_id 来自客户端 table,在其他 table 上找不到要更新和插入的数据?对于从主应用程序启动和更新的每条记录,要加载到其他 tables 的数据是相同的。

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

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 查询假设其他列有适当的默认值——如果需要,您可以为它们添加明确的值。

在闲逛了几个小时后,我草草地想出了一个可行的解决方案,因为它可能就在这里。我在临时表上测试了它。我确实必须使用数据编辑字段的默认值,一旦插入 client_id,它就会填充默认值并解决我的问题。

import mysql.connector
import pymysql
import sys
pathto = easygui.fileopenbox()
db = mysql.connector.connect(host='HOSTNAME', user='USER', passwd='PASSWORD', db='DATABASE')
mycursor = db.cursor()
mycursor.execute("select max(client_id) from c_temp")
myresult = mycursor.fetchone()
maxid = str(myresult).replace('(','')
maxid = maxid.replace(',','')
maxid = maxid.replace(')','')
path = pathto.replace('\','/')
if maxid =='None':
    print('NO MAX ID FOUND')
    maxid = str(0)
print(maxid)
print(path)
#import leads
def csv_to_mysql(load_sql, host, user, password):
    try:
        con = pymysql.connect(host=host,
                                user=user,
                                password=password,
                                autocommit=True,
                                local_infile=1)
        print('Connected to DB: {}'.format(host))
        # Create cursor and execute Load SQL
        cursor = con.cursor()
        cursor.execute(load_sql)
        print('Successfully loaded the table from csv.')
        con.close()

    except Exception as e:
        print('Error: {}'.format(str(e)))
        sys.exit(1)

# Execution Example
load_sql = "LOAD DATA LOCAL INFILE '"+path+"' INTO TABLE hometrust.c_temp\
 fields terminated by ',' LINES TERMINATED BY '\r\n'(first_name,address,city,state,zip,saledate,file_id);"
host = 'HOSTNAME'
user = 'USER'
password = 'PASSWORD'
csv_to_mysql(load_sql, host, user, password)

db.autocommit=False
try:
 mycursor.execute("INSERT INTO case_temp (client_id) SELECT client_id FROM c_temp WHERE client_id >"+maxid+";")
 mycursor.execute("INSERT INTO mit_temp (client_id) SELECT client_id FROM c_temp WHERE client_id >"+maxid+";")
 mycursor.execute("INSERT INTO proc_temp (client_id) SELECT client_id FROM c_temp WHERE client_id >"+maxid+";")
 db.commit()
except:
 db.rollback()