2012-04-20 8 views
0

多くのエントリを持つMySQLテーブルがあります。その(状態、ソース)として定義されたユニークなキーを持っているので、その列の組み合わせに対して重複はありません。しかし、今私は状態データの多くが一貫して入力されていないことを認識しています。たとえば、一部の行では「CA」と入力され、他の行では「カリフォルニア」と入力されます。mysqlの行を更新し、一意のキーで定義された複製を作成する場合はその行を削除します

"カリフォルニア"と言うすべてのエントリを "CA"に更新したいと思います。ユニークキーに競合が発生した場合は、その行を削除してください。どうやってやるの?

+0

あなたはに SELECT COUNT(ソース)、 'CA'、 'C​​A' で状態( 'カリフォルニア'、 'C​​A')のグループtblnameからソース、ソースは、カウント(ソース)を有する> 1 を行うことができます潜在的な紛争はどれくらいあるか考えてみてください。多くの人がいなければ手でこれを扱う方が簡単かもしれません。 – Brian

答えて

1

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

+0

データがまだデータベースに入力されるため、これは良い解決策ではないと思います。私の考えは、定期的に状態を入力して標準化したスクリプトを作成することでした。 – asolberg

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プロですから、これらのステートメントはおそらく最適化できますが、あなたは要点を得るでしょう。

+0

ありがとう – asolberg

関連する問題