0

これは、mysqlでIDを変更する方法に関連しています

私は他の質問もチェックしましたが、どれもこのようなものではありません。

ご存知のように、innodbには機能があります。たとえば、レコードのIDを変更したい場合、前のIDを指す他のすべてのテーブルが魔法のように更新されます。

2つのレコードをマージしたい場合はどうなりますか?

私には2つの事業があるとしましょう。

彼らは2つのIDを持っています。

それらを1つにマージしたいと思います。また、innodbのすばらしい機能を使用して自動的に変更したいと思います。

IDの1つを他のIDに変更することはできません。または私はできますか?

データベース内の2つの類似レコードをマージするにはどうしますか?

もちろん、実際に結合された記録に入るのはビジネス上の決定です。

基本的に、他のすべてのテーブルを1つずつピンポイントで指定したくありません。更新ルールには理由があると思います。slaveIDをmasterIDに変更し、master内のすべてのデータを同じに保ち、slaveIDを指すすべてのテーブルをmasterIDを指すように(プログラムではなく)データベース自体に再指定する方法はありますか?もちろん、slaveIDのレコードはとにかく失われます。

たとえば、通常のmysqlエンジンでは、IDを変更できます。次に、古いIDを指すすべてのテーブルを調べて、代わりに新しいIDを指す必要があります。innodbでは、そのリポイントはデータベースエンジン自体によって行われます。かっこいいですね。とにかく、なぜ誰もが非innodbエンジンを使用するのでしょうか。

同じことをしたいのですが、マージするためです。

4

1 に答える 1

1

レコードの主キーを既存の値に設定しようとすると、単にキー違反エラーが発生します。これは一見単純ですが、副作用がありますON UPDATE CASCADE。2 つのレコードをマージするために使用することはできません。単に機能しません。

スキーマを変更する可能性がある場合は、古くて優れたリダイレクト トリックを使用できます。

(ID が正であると仮定すると、おそらく unsigend int になります)

  • フィールドを追加するredirect int not null default 0
  • ビューを作成します。

.

CREATE VIEW tablename_view 
SELECT 
  -- repeat next line for every field apart from redirect
  IF(s.redirect>0,m.<fieldname>,s.<fieldname>
FROM tablename AS s
LEFT JOIN tablename AS m ON s.redirect=m.id
  • レコード (スレーブ) を別のレコード (マスター) 実行にマージするとUPDATE tablename SET redirect=<id_of_master> WHERE id=<id_of_slave>
  • 選択クエリを適応させて、tablename_view代わりに選択するtablename
  • マージ スレーブを除外するためのメンテナンス スクリプトを作成して使用する
于 2012-05-24T09:24:26.043 に答える