【问题标题】:load data infile order by line逐行加载数据infile
【发布时间】:2015-06-21 20:33:51
【问题描述】:

我 :) 我需要从 csv 插入 13500 行和 +500 列。 所以,我使用加载数据文件,它的工作。

但是,我的 MySQL 数据库和 Csv 需要完全相同的顺序。

其实比如csv的1000行可以在我基地的800处

我需要类似“按 column1 排序”之类的内容,但我找不到线索。

感谢您的帮助

Ps : 我有 2 个主键(产品的参考),它们不是数学顺序(如 1、8、4 等)

编辑:我的代码

$dataload = 'LOAD DATA LOCAL INFILE "'.__FILE__.'../../../../bo/csv/'.$nomfichier.'"
            REPLACE
            INTO TABLE gc_csv CHARACTER SET "latin1"
            FIELDS TERMINATED BY "\t"
            IGNORE 1 LINES
        ';

我只是拿 csv 并使用本地数据与他内联......而且订单没有得到完全尊重,我不知道为什么......

我的设计表

CREATE TABLE `csv` (
  `example` int(20) unsigned NOT NULL,
  `example` int(15) unsigned NOT NULL,
  `example` varchar(10) default NULL,
[...]
  `example` varchar(4) default NULL,
  PRIMARY KEY  (`RefCatSYS`,`IdProduit`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

【问题讨论】:

  • 您到底是按什么订购的?感觉信息量不够。有代码示例吗?
  • 您好,谢谢。我已经编辑了我的帖子以向您显示代码。

标签: php mysql sql csv load-data-infile


【解决方案1】:

在表中添加一个 auto_increment 列,默认为 NULL。当您使用 LOAD DATA INFILE 加载数据时,该列将没有任何值,并且会为其分配一个自动生成的 ID。选择按列排序的数据。

kostja@annie:~$ sudo cat  /var/lib/mysql/test/foo.csv   
10
9
8
7
6
5
4
3
2
1
mysql> create table tmp (example int primary key, id int unique auto_increment default null);
Query OK, 0 rows affected (0.11 sec)
mysql> load data infile "foo.csv" into table tmp;
Query OK, 10 rows affected, 10 warnings (0.03 sec)
Records: 10  Deleted: 0  Skipped: 0  Warnings: 10
mysql> select * from tmp;
+---------+----+
| example | id |
+---------+----+
|      10 |  1 |
|       9 |  2 |
|       8 |  3 |
|       7 |  4 |
|       6 |  5 |
|       5 |  6 |
|       4 |  7 |
|       3 |  8 |
|       2 |  9 |
|       1 | 10 |
+---------+----+
10 rows in set (0.00 sec)

【讨论】:

  • 谢谢,但是我不能创建一个唯一和默认值的字段... Navicat 说“不正确的表定义;只能有一个自动列,它必须定义为一个键。如果我添加了 Unique,Navicat 只是在我保存时重新检查了“允许 null”。我的新字段 id_csv 的第一个值是 12401、12402 ... 为什么从 12401 开始?
  • 一个表中不能有两个 auto_increment 列,是的。请注意,您在问题中的原始表定义不完整 - 列名重复,并且显然缺少重要列的定义。从表中的一列中删除 auto_increment 子句。加载数据后,您可以更改表并移动 auto_increment 子句 - 从代理列中删除它并将其添加到您想要的列中。
【解决方案2】:

关系数据库中的表是无序的记录集合。当您使用SORT BY 运行查询时,您可以按特定顺序获取行。如果查询不包含SORT BY 子句,服务器将按照它们在存储介质上的顺序返回这些行。此顺序有时会在记录更新时发生变化。您绝不能依赖它,并且始终使用SORT BY(和索引)来获取结果集中行的特定顺序。

LOAD DATA INFILE 从 CSV 文件中读取行并按照它们在文件中的相同顺序插入它们。除了设置自动递增列的值(如果表中有),CSV 文件中的行顺序无关紧要。

【讨论】:

    【解决方案3】:

    我已经解决了这个问题。事实上,WS 向我发送了一个带有多个两个主键的 csv。在第 2365 行和第 9798 行,RefCatSYS 和 IdProduit 相同。因此,文件中的加载数据将第 2365 行替换为 9798 并更改顺序。

    我要求他们发送第三个唯一的主键

    感谢您的帮助,对于造成的干扰,我们深表歉意。

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多