需要使用明文文件中的信息更新MariDB/MySQL表,具体取决于每行的开头字符
我会尽量让它简单,但它可能会有点长,主要是从例子中总结出来的。我有一个通过导入固定宽度文件创建的表,如下所示: 口袋妖怪:需要使用明文文件中的信息更新MariDB/MySQL表,具体取决于每行的开头字符,mysql,sql-update,sql-insert,mariadb,load-data-infile,Mysql,Sql Update,Sql Insert,Mariadb,Load Data Infile,我会尽量让它简单,但它可能会有点长,主要是从例子中总结出来的。我有一个通过导入固定宽度文件创建的表,如下所示: 口袋妖怪: 1 BULBASAUR 4 CHARMANDER 7 SQUIRTLE 16 MEW 25 MEWTWO 14
1 BULBASAUR
4 CHARMANDER
7 SQUIRTLE
16 MEW
25 MEWTWO
143 SNORLAX
666 MEPHISTOPHELES
所以像这样:
LOAD DATA LOCAL INFILE 'pokemon' INTO TABLE pokedex
(@row)
SET number = TRIM(SUBSTR(@row,2,3)),
name = TRIM(SUBSTR(@row,5,32))
;
我输入了数据,鲍勃是你叔叔。然而,每月更新文件显然不那么简单。它们看起来像这样:
LOAD DATA LOCAL INFILE 'pokemon' INTO TABLE pokedex
(@row)
SET number = TRIM(SUBSTR(@row,2,3)),
name = TRIM(SUBSTR(@row,5,32))
;
更新0:
C 16 PIDGEY
A 25 PIKACHU
A150 MEWTWO
C151 MEW
D666 MEPHISTOPHELES
每行的第一个字符不在数据库中。它表示应该如何处理该行。A代表添加,C代表更改,D代表删除。但它甚至不能这么简单
A和C在功能上是相同的。如果这个数字还没有记录在案,你就加上它。如果该号码已记录在案,则替换该号码。D、 谢天谢地,永远只是删除
因此,在上面的示例中,16的名称将更新为PIDGEY。25,虽然它被标记为一个附加项,但会被更新为PIKACHU,因为它已经存在。MEWTWO将被添加为150。MEW虽然标记为变更,但由于尚未记录在案,它将被添加为151。666将被删除
我所能做的,以及如果我不能得到任何令人满意的响应,我将要做的,就是用python和PyODBC设置一些东西来处理这些垃圾。不过,我希望有一种更优雅的SQL-only方法来减少移动部件的数量。我乐于接受并感谢您的建议。任何sql解决方案都可能不如使用python甚至bash优雅。。但您可以将数据加载到一个临时表中,其中a/C/D位于单独的列中,或者加载到3个表中,每个表对应一个a/C/D。然后执行一个连接到D行的删除查询,并在重复键更新时执行一个insert。。选择A/C rows/TABLE这正是我最终要做的。中间表,在A/C的重复键更新时插入,删除D的位置。