【问题标题】:mysql load data local infile syntax issues with set fieldsmysql 使用设置字段加载数据本地 infile 语法问题
【发布时间】:2013-09-03 19:35:53
【问题描述】:

我正在尝试使用 mysql 的 LOAD DATA LOCAL INFILE 语法将 .csv 文件加载到现有表中。这是我的.csv 文件中的一条记录(带有标题):

 PROD,       PLANT,PORD,  REVN,A_CPN,     A_CREV,BRDI,       DTE,     LTME
 100100128144,12T1,2070000,04,3DB18194ACAA,05_01,ALA13320004,20130807,171442

问题是我想要在导入期间完成 3 件额外的事情:

  1. A RECORDID INT NOT NULL AUTO_INTEGER PRIMARY_KEY 字段应在插入每一行时递增(此表列和结构已存在于 mysql 表中)

  2. 应将 DTE 和 LTME 连接起来并转换为 mysql DATETIME 格式并插入到名为 TRANS_OCR 的现有 mysql 列中

  3. CREATED TIMESTAMP 字段应设置为插入行时的当前 unix 时间戳(此表列和结构也已存在于 mysql 表中)

我正在尝试使用以下命令将此数据导入 mysql 表:

 LOAD DATA LOCAL INFILE 'myfile.csv' INTO TABLE seriallog
 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
 LINES TERMINATED BY '\n'
 IGNORE 1 LINES
 (FLEX_PN, FLEX_PLANT, FLEX_ORDID, FLEX_REV, CUST_PN, CUST_REV, SERIALID)
 SET CREATED = CURRENT_TIMESTAMP;

我认为我的 CREATED 列设置正确,但其他列导致发出 mysql 警告:

Warning: Out of range value for column 'FLEX_PN' at row 1
Warning: Row 1 was truncated; it contained more data than there were input columns

谁能帮我语法,LOAD DATA LOCAL INFILE 模块让我很困惑...

【问题讨论】:

    标签: mysql csv load-data-infile truncated


    【解决方案1】:

    找出正确的语法来完成这项工作:

    sql = """LOAD DATA LOCAL INFILE %s INTO TABLE seriallog_dev 
             FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' 
             LINES TERMINATED BY '\\n' 
             IGNORE 1 LINES 
             (FLEX_PN, FLEX_PLANT, FLEX_ORDID, FLEX_REV, CUST_PN, CUST_REV, SERIALID, @DTE, @LTME) 
             SET RECORDID = NULL, 
                 TRANS_OCR = STR_TO_DATE(CONCAT(@DTE,'',@LTME), "%%Y%%m%%d%%H%%i%%s"), 
                 CREATED = CURRENT_TIMESTAMP;"""
    
    params = (file,)
    self.db.query( sql, params )
    

    请注意——这是通过 python 的 mysqldb 模块完成的。

    警告

    此解决方案的唯一问题是,由于某种原因,我的批量插入仅插入了文件中的前 217 行数据。我的总文件大小是 19KB,所以我无法想象它对于 mysql 缓冲区来说太大了……那又是什么呢?

    更多信息

    另外,我刚刚在 msyql-server CLI 中直接尝试了这种语法,它适用于所有 255 条记录。所以,很明显是python,python mysqldb模块,或者mysqldb模块建立的mysql连接有问题……

    完成

    我刚刚发现了问题,它与加载数据本地 infile 命令无关,而是我在尝试导入 .csv 之前将原始 .dbf 文件转换为 .csv 的方法。由于某种原因,mysql 导入方法在 .dbf 到 .csv 转换方法完成之前在 .csv 上运行 - 导致在 .csv 文件中找到部分数据集并导入......抱歉浪费大家的时间!

    【讨论】:

      猜你喜欢
      • 2011-05-25
      • 1970-01-01
      • 2014-08-13
      • 2012-05-26
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      相关资源
      最近更新 更多