【问题标题】:SQL- LOAD DATA INFILE + REPLACE doesn't work (row 1 doesn't contain data for all columns)SQL- LOAD DATA INFILE + REPLACE 不起作用(第 1 行不包含所有列的数据)
【发布时间】:2017-07-24 08:24:42
【问题描述】:

这是 score_table 的样子。

Number | Name | Score | Parent
  1. 主键是数字+名称(复合键)。
  2. 导入 .csv 文件。
  3. Name 列由网络控制器设置。
  4. 表中已经存在数据:

Number | Name | Score | Parent 1 MJ 85 Micheal 2 Katie 60 Jay

现在我想使用load data infilereplace 将数据修改到表中。
(.csv 是 1 MJ 100 Micheal)
(意思是把MJ的分数换成100)

所以我写的SQL如下:

LOAD DATA INFILE scores.csv 
REPLACE INTO TABLE score_table 
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(Number,Score,Parent)
SET Name = #{name}

但出现错误:
第 1 行不包含所有列的数据

如何解决这个问题?谢谢!

PS:
也许应该让你知道
我试过写没有REPLACE的SQL语句。(其他都一样)
它有效(没有编译错误),但不能将分数从 85 更改为 100。

【问题讨论】:

  • “第 1 行不包含所有列的数据”表明数据存在问题,您正在尝试加载,您不觉得吗?向我们展示一些示例数据,包括第一行。
  • 我认为这不是数据的问题,因为我删除了 REPLACE 并且它有效(只是没有替换)

标签: mysql sql csv import


【解决方案1】:

试试:

文件:/path/to/file/scores.csv

1,MJ,100,Micheal

MySQL 命令行:

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.19    |
+-----------+
1 row in set (0.00 sec)

mysql> DROP TABLE IF EXISTS `score_table`;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE IF NOT EXISTS `score_table` (
    ->   `Number` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    ->   `Name` VARCHAR(255) NOT NULL,
    ->   `Score` INT UNSIGNED NOT NULL,
    ->   `Parent` VARCHAR(255) NOT NULL,
    ->   PRIMARY KEY (`Number`, `Name`)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `score_table`
    ->   (`Name`, `Score`, `Parent`)
    -> VALUES
    ->   ('MJ', 85, 'Micheal'),
    ->   ('Katie', 60, 'Jay');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT
    ->   `Number`,
    ->   `Name`,
    ->   `Score`,
    ->   `Parent`
    -> FROM
    ->   `score_table`;
+--------+-------+-------+---------+
| Number | Name  | Score | Parent  |
+--------+-------+-------+---------+
|      1 | MJ    |    85 | Micheal |
|      2 | Katie |    60 | Jay     |
+--------+-------+-------+---------+
2 rows in set (0.00 sec)

mysql> LOAD DATA INFILE '/path/to/file/scores.csv'
    -> REPLACE INTO TABLE `score_table`
    -> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
    -> LINES TERMINATED BY '\n'
    -> (`Number`, @`Name`, `Score`, `Parent`)
    -> SET `Name` = @`Name`;
Query OK, 2 rows affected (0.00 sec)
Records: 1  Deleted: 1  Skipped: 0  Warnings: 0

mysql> SELECT
    ->   `Number`,
    ->   `Name`,
    ->   `Score`,
    ->   `Parent`
    -> FROM
    ->   `score_table`;
+--------+-------+-------+---------+
| Number | Name  | Score | Parent  |
+--------+-------+-------+---------+
|      1 | MJ    |   100 | Micheal |
|      2 | Katie |    60 | Jay     |
+--------+-------+-------+---------+
2 rows in set (0.00 sec)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2012-07-03
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 2014-01-25
    相关资源
    最近更新 更多