2012-01-30 11 views
1

私はこの質問をGrouping and update large database tableにしましたが、私はこれに対する答えを得ていませんでした。重複キー更新時のSQLの更新

私はテーブルを持っています:name, date, detail, noname, date, detailは一緒にPKです。

何とか私はdetailを更新する必要があり、重複するキーがある可能性があります。したがって、重複行についてはnoを合計する必要があります。 ON DUPLICATE KEY UPDATEはにのみ使用されます。だからこの問題に対処する方法?

+0

あなたは明確にすることができますか?私は 'name = A、date = B、detail = C、no = 23'と' name = A、date = B、detail = D、no = 45'という2つの行があると仮定しています。したがって、2番目の行のディテールをCに更新すると、2つの行は 'name = A、date = B、detail = C、no = 68'の1行になります。しかし、 'name'と' date'フィールドも一致している場合のみです。 –

+0

そうです。実際にはこれらの行をマージしています。 – DrXCheng

+0

あなたの他の質問からは、これは「2列ではない」と推測していますが、詳細フィールドをすべて*より単純なものに変更することを目指しています(LIKEを使用する必要はありません)。すべての合併が起こるのですか? –

答えて

0

デザインが悪いです。代理ID主キーを使用して、これらのフィールドを複合一意索引にする必要があります。このテーブルを後で参照したい場合は、何を持っていますか? 3つの余分なフィールドが別のテーブルの外部キーとして、また別の大きなインデックスとして追加されます。どのように詳細フィールドを更新しますか?それが大きなテーブルの前にそれを言ったら、それはPKインデックスが再構築されることを意味します。可能であれば制約を無効にし、既に参照されていない場合は無効にします。ソース表からselect distinctまたはgroup byを選択し、このselectを使用して更新を行います。


EDIT REPLACE:複数列の主キーは、おそらく悪い考えであることを最初

REPLACE INTO table(name,date,detail) 
    select distinct name,date,(select distinict detail from table) from 
    table 
+0

PKは頻繁に更新されません。私はちょうど1回の更新をしたいと思う。 – DrXCheng

+0

これでREPLACEを使用できます。 http://dev.mysql.com/doc/refman/5.0/en/replace.html –

+0

ありがとうございます。あなたはこの場合の簡単な例を挙げることができますか? – DrXCheng

1

まず事を、。発見したように、個々のフィールドを操作することが難しくなります。あなたがしなければならないのは、新しい主キーとなるautoincrement bigintカラムをそのテーブルに追加することです.3カラムの一意性制約は一意のインデックスにすることができます。それはより良い実行する必要があります...しかし、それはまた、同様に必要な操作の種類を行うことができます。それはあなたが修正を行うことができますが、依然として整数インデックスで元の行を識別させます。

これを行うと、一時的なテーブルを作成する気にならない限り、「ワンタイム更新」を安全に行うことができるようになりました。

ユニーク 3列のインデックスを持たない同じスキーマでいくつかの一時テーブルを作成します。ユニークでないインデックスを持つことができます実行する。

処理する必要があるレコードを最初のテーブルにコピーします(ユニークな整数プライマリキーを含む)。

一時テーブルで更新する必要があるすべてのdetail列を更新します。

SUMGROUP BYを使用して、これらのレコードを2番目のテーブルにマージします。

INSERT INTO temp2 (...whatever...) SELECT ...whatever..., SUM(no) FROM temp1 GROUP BY ...whatever... 

最後に、(整数主キーを使用して)元のテーブルからTEMP1テーブルのすべてのレコードを削除し、元のテーブルにTEMP2テーブルのレコードを挿入します。

+1

複数列の主キーは悪い考えではありません。 –

+0

@ypercube私は、ビジネスモデルで一意の「自然」なものを主キーとして使用するという考えを気に入っていました。文字列であっても、複数の列の組み合わせであってもかまいません。数字のPKを「ちょうど」のために追加するよりも意味があるようです。しかし、OPが今やっているのと同じように、必然的な変更を加えなければならないときには、脆弱になります。 –

+0

OPが持っている問題は、彼がこのキーの値と同じ値を持つ複数の行を持っているからです。単純な 'GROUP BY'がデータを集めます。 (これらのデータを同じテーブルに入れて、複数の行を削除するのは難しいかもしれませんが、そうです)私は代理キーがどのように役立つか分かりません。 –

関連する問題