2

基本的にcsvファイルからデータを読み取り、MySQLデータベースに挿入するアプリケーションがあります。

最初はこれですべてうまくいっていました(私のSQL知識は混乱していますが、私は試しています):

LOAD DATA INFILE 'filename.csv' INTO TABLE tablename 
FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n' IGNORE 1 LINES

しかし最近、データベースに挿入されるファイルの列を検証する必要があったため、次のようなことを試しました。

LOAD DATA INFILE 'filename.csv' INTO TABLE tablename FIELDS TERMINATED
BY ';' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (@col1,@col2,@col3,@ignore,@ignore)
SET col1= @col1, col2= @col2, col3= @col3

「IGNORE 1 LINES」の部分を外すと、コマンドは正常に機能しますが、これが他のすべてを台無しにしている理由がわかりません。構文の間違いだと思いますが、考えられることはすべて試しましたが、まだ何も機能しません。誰も手がかりを持っていますか?

編集:「IGNORE 1 LINES」をそのままにしておくと、「SQL 構文にエラーがあります。マニュアルの yadda yadda yadda を確認して、1 行目の 'IGNORE 1 LINES' の近くで使用してください。」

テスト用に、単純なファイルを使用しています。最初の 5 行は次のとおりです。

col1;col2;col3;col4;col5
テスト;テスト;テスト;テスト;テスト
テスト 2;テスト 2;テスト 2;テスト 2;テスト 2
テスト3;テスト3;テスト3;テスト3;テスト3
テスト4;テスト4;テスト4;テスト4;テスト4
4

1 に答える 1

1

構文的には、ステートメントは正しく、期待どおりに機能するはずです。

mysql> テーブル tablename を作成
    -> (
    -> col1 varchar(32),
    -> col2 varchar(32),
    -> col3 varchar(32),
    -> col4 varchar(32),
    -> col5 varchar(32)
    -> );
クエリ OK、影響を受ける行は 0 (0.03 秒)

mysql> LOAD DATA INFILE '/tmp/filename.csv'
    -> INTO TABLE テーブル名
    -> ';' で終了するフィールド
    -> LINES TERMINATED BY '\n' -- 私は Mac を使用しているので、\r\n の代わりに \n を使用しています
    -> 1行無視
    -> (@col1、@col2、@col3、@ignore、@ignore)
    -> SET col1 = @col1、col2 = @col2、col3 = @col3
    -> ;
クエリ OK、影響を受ける 4 行 (0.01 秒)
レコード: 4 削除: 0 スキップ: 0 警告: 0

mysql> テーブル名から * を選択します。
+------+-------+-------+------+------+
| | 列1 | col2 | col3 | col4 | col5 |
+------+-------+-------+------+------+
| | テスト | テスト | テスト | ヌル | ヌル |
| | テスト2 | テスト2 | テスト2 | ヌル | ヌル |
| | テスト3 | テスト3 | テスト3 | ヌル | ヌル |
| | テスト4 | テスト4 | テスト4 | ヌル | ヌル |
+------+-------+-------+------+------+
4 行セット (0.00 秒)

構文エラーが発生しているので、LOAD DATAステートメント自体に問題があるのではなく、クエリ文字列を作成して実行するために使用する C# コードに問題がある可能性が高いと思います。

于 2013-10-09T19:07:20.207 に答える