0

だから、私が制御できないcsvファイルがあるとしましょう:

a.csv
b.csv
c.csv

それらはすべて異なるヘッダー名を持っています。すべてのデータをテーブル a、b、および c にダンプしました。ここで、新しい値 (同じヘッダー フィールド) を持つ別の a.csv を取得した場合、古いものにはない新しい a の値のみを挿入するにはどうすればよいですか?

例: テーブルには名前と年齢のヘッダーがあります。

'Bob'   25
'Mary'  50

そして、次のように解析する新しい a.csv を取得します。

'Bob'   25
'Susie' 60

現在のテーブルに固有の行のみを追加するにはどうすればよいですか (たとえば、ボブではなくスージーのみをテーブルに追加する)。それぞれに特定の一意の ID がないため、主キーを使用できません。複数のヘッダー フィールドもあるため、すべてのヘッダー フィールドを主キーとして使用しようとすると、「指定されたキーが長すぎます」と返されます。

行全体が一意であることを確認し、一意である場合はテーブルに追加する必要があります。INSERT IGNORE を試しましたが、一意のキーがないため、正しく機能しません。助言がありますか?追加情報があれば投稿します。

現在の試行:

cursor.execute("ALTER TABLE temp ADD PRIMARY KEY" + uniqueline)
cursor.execute("INSERT IGNORE INTO " + tablename + " SELECT * FROM temp")

tablename はテーブルの名前、temp は csv コードが送信された場所、uniqueline は現在フォームの最初の 5 つのフィールド (field1、field2、field 3、field4、field5) です。フィールドが 5 つ未満の場合は、すべてのフィールド。

ありがとう!

編集:

cursor.execute("INSERT INTO " + tablename + " SELECT * FROM temp where " + uniqueline + " NOT IN (SELECT * FROM " + tablename + ")")

一度は (空のテーブルで) 動作しますが、もう一度実行してテストすると、基本的にフリーズし、終了しません。現在、これらの「ファントムテーブル」があり、削除しようとすると「不明なテーブル」と表示されますが、作成しようとすると「テーブルが既に存在します」と表示されます。また、テーブルをフリーズせずにテーブルに何かを追加または削除することもできません。一意のインデックスをもう一度付けてみます。でも、みんなの助けに感謝します!

4

2 に答える 2

0

次のように一意のインデックスを持つようにテーブルを更新することができます。

       ALTER IGNORE TABLE MyTable ADD UNIQUE INDEX idx_name (name, age);

完了すると、挿入時に重複行を自動フィルタリングする必要があります。例外を処理する必要がある場合があります。

回避策は、すべての CSV ファイルをロードする前にインデックスを削除することです。データがアップロードされたら、インデックスを再適用して重複レコードを削除します。

于 2013-06-17T16:13:46.353 に答える
0

どうですか:

insert into MyTable select * from temp where (tempcolumn1, tempcolumn2, ..., tempcolumnn) not in (select * from MyTable)
于 2013-06-17T16:22:29.963 に答える