MYSQL在文件中加载数据并获取最后一个插入ID,然后将数据插入到另一个表中

MYSQL在文件中加载数据并获取最后一个插入ID,然后将数据插入到另一个表中,mysql,load-data-infile,Mysql,Load Data Infile,可以说,我想用一块石头杀死多只鸟。我正在使用windows命令行mysql.exe加载从我正在使用的另一个程序调用的本地infle,我发现还有3个表需要更新,它们使用主表中的自动递增PK。表名是案例信息、缓解和处理。案例信息中的字段名包括案例id、客户id、销售数据、费用数据和收入数据。缓解措施中的字段名为mit\u id、客户端\u id和缓解措施数据。 处理中的字段名是proc_id、客户机id和处理数据。 我正在传递给cli的命令 mysql.exe -uUSER -pSOMEPASSWO

可以说,我想用一块石头杀死多只鸟。我正在使用windows命令行mysql.exe加载从我正在使用的另一个程序调用的本地infle,我发现还有3个表需要更新,它们使用主表中的自动递增PK。表名是案例信息、缓解和处理。案例信息中的字段名包括案例id、客户id、销售数据、费用数据和收入数据。缓解措施中的字段名为mit\u id、客户端\u id和缓解措施数据。 处理中的字段名是proc_id、客户机id和处理数据。 我正在传递给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个表上运行insert语句,以便在加载每个记录后进行加载数据本地填充时,将文本插入所有3个表上的*_数据字段和client_id字段。我不确定这是否可能,如果不可能,是否有人能帮我设计一个查询,一次运行所有查询,或者在加载后运行,从客户表中获取客户机id,在其他待更新的表中找不到该id并插入数据?要加载到其他表中的数据对于从主应用程序启动和更新的每条记录都是相同的。

在从文件加载记录之前启动事务。然后,您可以保存旧的
MAX(client\u 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
查询假定其他列有适当的默认值——如果需要,您可以为它们添加显式值。

经过几个小时的胡闹之后,我终于想出了一个可行的解决方案,可能就是这样。我在临时台上测试了它。我必须用数据编辑字段的默认值,一旦插入客户机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()


似乎编写一个脚本来实现这一点将是一个更有效的解决方案。您可以使用什么编程语言将数据加载到临时表中,并使用标准sql填充临时表中的其他表我懂一点python,但对我来说,将类似内容写入python可能需要几周甚至几个月的时间。我已经安装了python和ruby来运行脚本。很抱歉,我应该发布到cli的实际查询是什么样的,并且变量已经就位,
mysql.exe-uUSER-pSOMEPASSWORD-hEXAMPLE.COM TABLENAME-e“将数据本地填充'C:/Users/Admin/Desktop/karen/1205/brockrdy.csv'加载到以”“结尾的表客户端字段中,行以”“结尾\r\n”(名字、地址、城市、州、邮政编码、销售日期、文件id、上次更新、上次更新
这是一个选定的文件经过一段时间的思考后,我可能能够用python脚本完成这项工作,比我原来想的要简单。你给了我事务中需要的步骤,所以我现在就去玩它,看看它是什么样的垃圾。)我可以。我会把结果发回去的。