导入CSV从现有表中拉出一个列字段

时间:2013-08-10 08:17:11

标签: mysql sql

我正在学习MySQL和PHP(运行XAMPP并使用HeidiSQL),但我正在尝试使用它的实时项目,而不是目前信息所在的大量电子表格。

我想将1000多行导入表(tbl_searches),其中一列是字符串(contract_no)。不在tbl_searches所需的电子表格中的信息包括search_id(PK并且是AUTO_INCREMENT)和contract_id。所以我真正缺少的唯一领域是contract_id。我有一个包含contract_id和contract_no的表(tbl_contracts)。所以我想我可以使用字符串contract_no引用该表来获取contract_no的contract_id,但我不知道如何。

[编辑]我忘了提到我在将tbl_contracts导出到Excel之后使用HeidiSQL成功导入了信息,然后使用了Excel VLOOKUP函数,但最终以某种方式产生了错误的数据。

3 个答案:

答案 0 :(得分:2)

你可以这样做

LOAD DATA LOCAL INFILE '/path/to/your/file.csv' 
INTO TABLE table1 
  FIELDS TERMINATED BY ',' 
         OPTIONALLY ENCLOSED BY '"' 
  LINES TERMINATED BY '\n' -- or '\r\n' if the file has been prepared on Windows
(@field1, @contract_no, @field2, @field3,...) 
SET column1 = @field1,
    contract_id = (SELECT contract_id 
                     FROM tbl_contracts 
                    WHERE contract_no = @contract_no 
                    LIMIT 1),
    column2 = @field2,
    column3 = @field3
    ...

答案 1 :(得分:0)

尝试这样的事情:(我假设你在tbl_contracts中有数据)

<?php
  $handle = fopen("data_for_table_searches.csv", "r"); 

  while (($data = fgetcsv($handle,",")) !== FALSE) {  // get CSV data from you file
    $contract_id = query("SELECT contract_id FROM tbl_contracts WHERE contract_number = " . $data[<row for contract number>]);   // whatever is the equivalent in heidi SQL, to get contract id
    query("INSERT INTO tbl_searches values($contract_id, data[0], data[1], data[2],...)");  // whatever is the equivalent in heidi SQL, insert data, including contract id into tbl_searches
  }
  fclose($handle);
?>

答案 2 :(得分:0)

感谢大家的投入。 peterm的指导帮助我获取了导入的数据。 Rahul,我应该提到我没有使用PHP来完成这项任务,而只是尝试使用HeidiSQL将数据放入表中。 user4035要求更多细节,所以也在这里。

我在数据库中有三个表。

  1. tbl_status有两个字段,status_ID(AUTO_INCREMENT)和status_name。
  2. tbl_contracts有两列,contract_ID(AUTO_INCREMENT)和contract_no(字符串)。
  3. 最后一个表(tbl_searches)将是活动(?)表,因为这是用户操作的记录位置。
  4. 这些表中的前两个很容易填充。 tbl_status有11行描述合同的状态,这些行只是输入到Excel电子表格中,然后通过HeidiSQL通过CSV导入。

    对于第二个表格,我要导入1,000多个“合约”,因此我将Excel中的第一列留空,第二列包含合同字符串并以相同方式导入它们。

    第三个表有七个字段:search_id(AUTO_INCREMENT),contract_id,contract_no,status_id,notes,姓名缩写和search_date(我刚才忘记了那个)。

    我想将包含搜索信息的电子表格插入到tbl_searches中。它有contract_no,但不是contract_id。我需要插入行并让查询从tbl_contracts中获取contract_id。我花了一些时间才弄清楚没有错误和一些意想不到的结果。 (以下查询省略了对search_date的需求。)

    LOAD DATA LOCAL INFILE '\\\\PATH\\PATH\\PATH\\PATH\\FILENAME.csv'
    INTO TABLE `hoa_work`.`tbl_searches`
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES --because the first row of the CSV has column headers
    (@search_id, @contract_id, @contract_no, @status_id, @notes, @initials)
    SET
        search_id = NULL, --is an AUTO_INCREMENT field
        contract_id = (SELECT contract_id
            FROM tbl_contracts
            WHERE contract_no = @contract_no
            LIMIT 1),
        contract_no = @contract_no,
        status_id = @status_id,
        notes = @notes,
        initials = @initials;
    /* Affected rows: 1,011  Found rows: 0  Warnings: 0  Duration for 1 query: 0.406 sec. */
    

    我在这里了解到@blah是用户变量。如果我运行以下查询,它将告诉我如何定义变量。由于我从CSV文件中插入了1,000多行,因此它为我插入的最后一行提供了答案。

    SELECT @contract_no
    

    如果您对我最终编写查询的方式有任何建议的改进,请告诉我。

    -Matt