Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要使用明文文件中的信息更新MariDB/MySQL表,具体取决于每行的开头字符_Mysql_Sql Update_Sql Insert_Mariadb_Load Data Infile - Fatal编程技术网

需要使用明文文件中的信息更新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的位置。