0

多くのエントリを持つ MySQL テーブルがあります。(状態、ソース) として定義された一意のキーを取得したため、その列の組み合わせの重複はありません。しかし、現在、状態データの多くが一貫して入力されていないことに気付きました。たとえば、「CA」と入力されている行もあれば、「California」と綴られている行もあります。

「カリフォルニア」というすべてのエントリを「CA」に更新し、一意のキーで競合が発生する場合は、行を削除したいと思います。どうやってやるの?

4

2 に答える 2

1

データをダンプし、 GoogleRefineなどの外部ツールを使用してデータをクリーンアップする方がよい場合があります。これらの問題を回避するために、将来的に外部キーの使用を検討してください。

于 2012-04-20T16:17:48.423 に答える
0

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 のプロではないので、これらのステートメントはおそらく最適化できますが、要点はわかります。

于 2012-04-20T16:34:52.290 に答える