1

あちこち検索しましたが、これを理解できないようです。これが私の最初の Stack Exchange の質問です。

Java プログラムを使用してバルク ロード プロセスを実行していますが、SQL クライアントの MySQL Workbench から直接試してみたところ、同じエラーが発生しました。

LOAD DATA INFILE '/path/to/file/infile.csv' 
INTO TABLE t1
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n'
(category, item, date_time, v1, v2, v3);

エラー:

Error Code: 1062. Duplicate entry ''Book'-'Fiction'-2014-04-16 09:33:00' for key 'PRIMARY'

私のSQLクライアントを使用して、テーブルにそのような現在のレコードがないことを確認しました。実際、同じ月に同じカテゴリとタイプのペアのレコードはありません。毎月、MySQL データベースにロードする CSV ファイルが多数 (~16,000) あります。各ファイルは、1 か月の間に異なる値を持つ個別のカテゴリとタイプのペアに対応しています。私はこれまでにこの方法で 5,000 万件以上のレコードを読み込んで成功していますが、同じエラーが発生せずにこれ以上読み込めないようです。

私のテーブルは 3 つのフィールドを使用して PRIMARY キーを作成し、2 つの varchar() と datetime を使用します。

'CREATE TABLE `t1` (
  `category` varchar(10) NOT NULL,
  `item` varchar(15) NOT NULL DEFAULT '''',
  `date_time` datetime NOT NULL,
  `v1` double DEFAULT NULL,
  `v2` double DEFAULT NULL,
  `v3` double DEFAULT NULL,
  PRIMARY KEY (`category`,`type`,`date_time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1'
  • 過去にデータベースを扱ったことがありますが、これほど多くのレコードはありません。それが問題なのかどうかはわかりません。

  • 主キーに自動インクリメント ID を使用するように切り替えることもできますが、多数のレコードを考慮すると、より多くのスペースが必要になる可能性があり、(category、item、date_time) の重複が発生する可能性があり、問題が発生する可能性があります。

  • MySQL では、文字列として指定された値に対して「緩和された」形式が許可されていることを知っています。これを理解するには、追加の形式設定を行う必要があるかもしれません。

  • ''Book'-'Fiction'-2014-04-16 09:33:00' という値を持つ csv ファイルの最初の行を削除しましたが、次の日時の値 ''Book' に対して同じ 1062 エラーが発生します。 '-'フィクション'-2014-04-16 09:35:00'

  • 日時文字列をフォーマットしている方法かもしれないと思いましたが、他の何千もの LOAD DATA INFILE で機能する「YYYY-MM-DD HH:MM:SS」フォーマットを使用しています。安全のために、STR_TO_DATE() 関数を使用してみました。以下を参照してください。

    LOAD DATA INFILE '/path/to/file/infile.csv' INTO TABLE t1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (category, item, @date_var, v1, v2, v3) SET date_time = STR_TO_DATE( @date_var, '%Y-%m-%d %H:%i:%s');

どんな助けでも大歓迎です。

4

0 に答える 0