残念ながら、これは許可されていません。これは、このようなクエリをトランザクションに保つことが難しいためです。複数ステートメントのトランザクションは、単一の挿入選択のトランザクション性を保証するために内部的に使用されます (1 つのパーティションが失敗した場合 (重複キーまたは何か)、すべてをロールバックしたい!)。cross-db マルチステートメント トランザクションがないので (まだ!)、cross-db insert-select もありません (まだ!)。
より良いソリューションにご期待ください。
ただし、これを本当にやりたい場合は、次のようにします。でも、
自己責任で進めてください。これはサポートされている手順ではありません。
しかし、それはうまくいくはずです。
1)db_b
で、 と同じ列を持つテーブルを作成しますsource_table
が、シャード キーを作成しますSHARD()
。
2)db_a
で、実行しSHOW PARTITIONS
ます。
3) これらのパーティションごとに、 にdb_a_<ordinal>
リストされているホストとポートへの接続を作成しSHOW PARTITIONS
ます。その接続で実行SHOW DATABASES
すると、 という名前のデータベースがいくつか表示されますdb_b_<another>
。どちらでも構いません。実行しますINSERT INTO db_b<another>.source_table SELECT * from db_a_<ordinal>.source_table
。
3.5) この時点では、関心のあるテーブルにまだ書き込みを行っていませんが、これから書き込みます。を見てくださいdb_b.source_table
。すべて正しいですか?そこにすべてのデータがありますか?実行SHOW CREATE TABLE
して、シャード キーが存在することを再確認しますSHARD KEY ()
(コメントに含まれている必要があります)。すべてがよく見える?では、先に進みましょう。
4)すべてのパーティションに対してこれを実行した後、必要なことを行うことができますINSERT INTO db_b.target_table (cols) SELECT cols from db_b.source_table
。
幸運を!