2

あるデータベースのテーブルから別のデータベースのテーブルへのフィールド リストを使用して単純な挿入を実行しようとしています。

insert into db_a.target_table (field1,field2,field3) select field1,field2,field3 from db_b.source_table; 

エラーメッセージは単純なようです..

MemSQL は、このタイプのクエリをサポートしていません: クロスデータベース INSERT ... SELECT

奇妙なことに、この例は機能します。

insert into db_a.target_table select * from db_b.source_table;

しかし、これはよくあるシナリオのようです。誰かが同様の問題に遭遇しましたか?それを回避できましたか?

4

1 に答える 1

0

残念ながら、これは許可されていません。これは、このようなクエリをトランザクションに保つことが難しいためです。複数ステートメントのトランザクションは、単一の挿入選択のトランザクション性を保証するために内部的に使用されます (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

幸運を!

于 2015-09-16T15:11:18.107 に答える