主キーが自動インクリメントに設定され、一意キーが一意である、かなり構造化されていないテーブルが与えられます。概念的には、UNIQUEキーが主キーであると想定されていましたが、テーブルを作成した人は、テーブルの作成時にUNQIUEキーの列情報を持っていませんでした。
次に、提供されたテキストファイルに更新された行と新しい行が含まれているこのテーブルの定期的な更新を開始する必要があります。課題は、UNIQUEキーに一致する値があり、自動インクリメントされる限り、実際には主キー自体を気にしない場合に行を置き換えることです。
ただし、LOAD DATA INFILEの構造は、既存のPKをリセットするためです。これは悪いことです。PKを保持した理由は、他のレガシーテーブルへの外部キーであるためです(ため息...)。
だから...更新されたテーブルをテキスト形式で読み取り、PKを台無しにすることなくUNIQUEキー列に基づいて更新するエレガントなSQLのみの更新スクリプトを作成する方法はありますか?
解決策は、テーブルをタブフォームにエクスポートし、VLOOKUPを実行して、一致するPK値(または新しい行の場合はNULL)を持つ行を割り当てることだと思います。
何か入力はありますか?
編集:誰かが私が一時テーブルにLOAD DATE INFILEを実行し、そこからINSERT/UPDATEを実行することを提案しました。この投稿とその投稿の内容に基づいて、私が提案するスクリプトは次のとおりです。
// Create temporary table
CREATE TABLE tmp {
// my specifications
}
// Load into temporary table
LOAD DATA LOCAL INFILE *'[my tab file]'*
REPLACE INTO TABLE *mytable* FIELDS TERMINATED BY '\t' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
// Set copy all the columns over except the PK column. This is for rows with existing UNIQUE values
UPDATE mytable
RIGHT JOIN tmp ON mytable.unique = tmp.unique
SET mytable.col1 = tmp.col1, ..., mytable.coln = tmp.coln, mytable.unique = tmp.unique;
// Now insert the rows with new UNIQUE values
INSERT IGNORE INTO mytable (mytable.col1, mytable.col2, ...)
SELECT tmp.col1, tmp.col2, ... FROM tmp
// Delete the temporary table now.
DROP tmp;
Edit2:上記のクエリを更新してテストしました。動作するはずです。何か意見はありますか?