多くのエントリを持つ MySQL テーブルがあります。(状態、ソース) として定義された一意のキーを取得したため、その列の組み合わせの重複はありません。しかし、現在、状態データの多くが一貫して入力されていないことに気付きました。たとえば、「CA」と入力されている行もあれば、「California」と綴られている行もあります。
「カリフォルニア」というすべてのエントリを「CA」に更新し、一意のキーで競合が発生する場合は、行を削除したいと思います。どうやってやるの?
多くのエントリを持つ MySQL テーブルがあります。(状態、ソース) として定義された一意のキーを取得したため、その列の組み合わせの重複はありません。しかし、現在、状態データの多くが一貫して入力されていないことに気付きました。たとえば、「CA」と入力されている行もあれば、「California」と綴られている行もあります。
「カリフォルニア」というすべてのエントリを「CA」に更新し、一意のキーで競合が発生する場合は、行を削除したいと思います。どうやってやるの?
データをダンプし、 GoogleRefineなどの外部ツールを使用してデータをクリーンアップする方がよい場合があります。これらの問題を回避するために、将来的に外部キーの使用を検討してください。
1 つの SQL ステートメントでこれを行うことはできないと思います。また、他のテーブルからクリーンアップしようとしているテーブルへの外部キー関係がある場合は、これを 1 つのステップで実行したくはありません(できたとしても)。
CREATE TABLE state_mappings (
`old` VARCHAR(64) NOT NULL,
`new` VARCHAR(64) NOT NULL
);
INSERT INTO state_mappings VALUES ('California', 'CA'), ...;
INSERT IGNORE INTO MyTable (state, source)
SELECT sm.new, s.source from states s JOIN state_mappings sm
ON s.state = sm.old;
// Update tables with foreign keys here
DELETE FROm MyTable WHERE state IN (SELECT distinct old FROM state_mappings);
DROP TABLE state_mappings;
私は SQL のプロではないので、これらのステートメントはおそらく最適化できますが、要点はわかります。