【问题标题】:MYSQL LOAD DATA IN FILE and get LAST_INSERT_ID and INSERT DATA into Another tableMYSQL LOAD DATA IN FILE 并将 LAST_INSERT_ID 和 INSERT DATA 放入另一个表
【发布时间】:2020-04-09 05:46:29
【问题描述】:

可以这么说,我正试图用 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 个表上运行插入语句,以将文本插入 *_data 字段和 client_id 字段在加载每条记录后执行加载数据本地 infile 时所有 3 个表。我不确定这是否可能,如果不是,有人可以帮助我制作一个查询以一次运行或在加载后运行以从未找到的客户端表中获取 client_id在要更新和插入数据的其他表上?对于从主应用程序开始和更新的每条记录,要加载到其他表中的数据都是相同的。

【问题讨论】:

  • 似乎编写脚本来执行此操作将是解决问题的更有效途径。您可以使用哪种编程语言
  • 将数据加载到临时表中,并使用标准 sql 填充该临时表中的其他表
  • 我知道一点 Python,但对我来说,将类似的东西写到 Python 中需要几周甚至几个月的时间。我安装了 python 和 ruby​​ 来运行脚本。

标签: mysql load-data-infile


【解决方案1】:

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

【讨论】:

  • 抱歉,我应该在 cli 的实际查询中发布变量,mysql.exe -uUSER -pSOMEPASSWORD -hEXAMPLE.COM TABLENAME -e "load data local infile 'C:/Users/Admin/Desktop/karen/1205/brockrdy.csv' into table clients fields terminated by ',' LINES TERMINATED BY '\r\n'(first_name,address,city,state,zip,saledate,file_id,last_updated,last_updated,即选择了一个文件
  • 在离开片刻并考虑之后,我可能可以比我最初想象的更容易在 python 脚本中执行此操作。你给了我交易所需的步骤,所以我要去玩它,看看我能造成什么样的伤害。我会发回我的结果。
【解决方案2】:

在搞砸了几个小时后,我能够想出一个可行的解决方案,因为它可能就在这里。我在临时表上对其进行了测试。我确实必须使用数据编辑字段的默认值,一旦插入 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()

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2014-02-05
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多