【问题标题】:How to import text file to table with primary key as auto-increment如何使用主键作为自动增量将文本文件导入表
【发布时间】:2011-01-28 15:27:52
【问题描述】:

我的文本文件中有一些批量数据需要导入 MySQL 表。该表由两个字段组成..

  1. ID(自增整数)
  2. 名称(varchar)

文本文件是一大组名称,每行一个名称...

(示例)

John Doe
Alex Smith
Bob Denver

我知道如何通过 phpMyAdmin 导入文本文件,但据我了解,我需要导入与目标表具有相同字段数的数据。有没有办法将我的文本文件中的数据导入一个字段并让 ID 字段自动递增?

提前感谢您的帮助。

【问题讨论】:

    标签: import phpmyadmin auto-increment


    【解决方案1】:

    我使用的另一种不需要重新排序表字段的方法(假设自动递增字段是第一列)如下:

    1) Open/import the text file in Excel (or a similar program).
    
    2) Insert a column before the first column. 
    
    3) Set the first cell in this new column with a zero or some other placeholder.
    
    4) Close the file (keeping it in its original text/tab/csv/etc. format).
    
    5) Open the file in a text editor.
    
    6) Delete the placeholder value you entered into the first cell.
    
    7) Close and save the file.
    

    现在您将拥有一个文件,其中包含原始文件的每一行,前面有一个空列,在通过 phpMyAdmin 导入时将转换为下一个相关的自动增量值。

    【讨论】:

    • 如果你想为 ID 创建一个额外的列,我推荐这个建议
    • 这是最好的答案!快速简单!
    • 如果您正在处理可以在 excel 中打开的较小数据集,那么这是要走的路。只需为主键添加一个额外的列即可。请注意,我在导入数据时总是有一个标题列,并在导入时使用“IGNORE 1 LINES”。如果您没有标题行,行为可能会有所不同
    • 如何在Excel中打开超过1000万行的csv文件
    • 不起作用:“#1366 - 不正确的整数值:'' for column 'id' at row 1”。
    【解决方案2】:

    这是迄今为止最简单的方法:

    1. 确保您的文件没有包含列名的标题行。如果有,请将其删除。
    2. 在 phpMyAdmin 中,像往常一样:进入您的表的 Import 选项卡并选择您的文件。选择CSV 作为格式。然后——这是重要的部分——在

    格式特定选项:

    ...在Column names: 填写数据所在列的名称,在您的情况下为“名称”。

    这将导入名称并自动增加id 列。大功告成!

    使用 phpMyAdmin 4.2.7.1 测试良好。

    【讨论】:

    • 这也适用于 4.0.10.10。谢谢!我发誓,当我写下我的答案时,这是不可能的。
    【解决方案3】:

    使用 LOADTABLE INFILE 导入时不正确,只需将自动增量列创建为 LAST 列/字段...作为其解析,如果您的表定义为 30 列,但文本文件只有 1 个(或更少),它将首先按直接顺序导入前导列,因此请确保您在字段之间用...分隔是正确的(对于任何未来的导入)。同样,将自动增量放在您知道要导入的列数之后。

    create table YourMySQLTable
    (  FullName varchar(30) not null ,
       SomeOtherFlds varchar(20) not null,
       IDKey int not null AUTO_INCREMENT,
       Primary KEY (IDKey)
    );
    

    请注意,IDKey 在表格的最后一个字段中会自动递增...无论您的 INPUT 流文本文件的列数可能少于最终表格实际容纳的列数。

    然后,通过...导入数据

    LOAD DATA
        INFILE `C:\SomePath\WhereTextFileIs\ActualFile.txt`
        INTO TABLE YourMySQLTable
        COLUMNS TERMINATED BY `","`  
        LINES TERMINATED BY `\r\n` ;
    

    以上示例基于逗号分隔列表,每个字段都带有引号,例如 “myfield1”、“anotherField”、“LastField”。此外,终止的是典型文本文件每行分隔的cr/lf

    在将全名作为单列的文本文件示例中,所有数据都将加载到“YourMySQLTable”的全名列中。由于 IDKey 位于列表的末尾,它仍然是从 1-?并且与入站文本中的列没有任何冲突。

    【讨论】:

    • 恐怕我不太明白你的回答。你能再细分一点吗?我不确定您将自动增量列创建为最后一个文件是什么意思。
    • 没有其他方法可以跳过主键吗?
    • @Rijo,正确,所有表都应该有一个主键。在这种情况下,由于它实际上只是一个用于进行批量插入的临时表,因此将 LAST COLUMN 作为主键只是允许这种限定。然后可以处理、清理记录并将其导入到生产表中,然后可以为下一次批量加载清除该表。无论如何,谁在乎主键 ID 列放置在哪个物理位置以进行临时工作。
    【解决方案4】:

    我只是使用 TAB 作为文本文件中的第一个字段,然后像往常一样导入它。我收到有关 ID 字段的警告,但该字段按预期递增...

    【讨论】:

      【解决方案5】:

      我刚试过这个:

      1. 在 phpMyAdmin 表中 - 匹配 csv 中的字段数量。
      2. 将 csv 数据导入表中
      3. 转到 [Structure] 选项卡并添加一个新字段 [At beginning of table](我假设您需要 id 字段)
      4. 将[name]属性填写为“id”,
      5. [长度]到“5”
      6. [索引]到“主要”
      7. 勾选 A_I(自动增量)
      8. 点击 [Go] 按钮
      9. 该表应该已更新为所有数据前面的 id 字段并自动递增。

      至少这样你就不用担心匹配字段等问题了。

      【讨论】:

        【解决方案6】:

        我已经解决了这个问题,只需在不带列 ID 的 Format-Specific Options 下添加 column_names。因为列 ID 是自动递增的。就我而言,它可以正常工作,而无需更改 CSV 文件中的任何内容。我的 CSV 文件只有数据,没有列标题。

        【讨论】:

          【解决方案7】:

          如果表格列不匹配,我通常会在实际数据所在的位置添加带有空数据的“虚假”字段,因此,如果我的表格需要 "id", "name", "surname", "address", "email" 而我有 "id", "name", "surname",我会更改我的 CSV文件有"id", "name", "surname", "address", "email",但将我没有数据的字段留空。

          这会生成一个如下所示的 CSV 文件:

          1,John,Doe,,
          2,Jane,Doe,,
          

          我发现它比其他方法更简单。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-21
            • 1970-01-01
            • 2012-02-22
            • 2013-04-06
            • 1970-01-01
            相关资源
            最近更新 更多