1

テーブルXとビューY(Xと同じ構造を持つ)が与えられた場合、XをZに、YをXにアトミックに名前変更して、クエリにXという名前の何も表示されないようにする方法はありますか?Xの名前を変更してビューを作成することも有効です。

重要なのは、スキーマ移行計画の一環として、古いテーブルを新しいバージョンの古いバージョンをシミュレートするビューに置き換えて、クライアントコードの両方のセットを同時に実行できるようにすることです。

MySQLが私の選択ですが、他の人に関する情報も役立つでしょう。

4

3 に答える 3

5

これは、postgres では些細なことですが、mysql では不可能です。

mysql は、スキーマの変更をトランザクションから除外します。私はpostgresのバックグラウンドを持っているので、それは当然のことです(トランザクションを開始し、何かを実行し、コミットまたはロールバックします-postgresは「何かを実行する」ことについてうるさくありません)。

mysql のバグベースを調べると、いくつかのバグを見つけることができます。

于 2008-11-29T00:23:02.817 に答える
2

MySQL は、Oracle と同様に、ほとんどの DDL ステートメント (CREATE TABLE、ALTER TABLE など) を「暗黙のコミット」の原因と見なします。トランザクション モデルを使用して、他の接続が DDL の変更を確認できないようにすることはできません。(この点に関して、Postgres は珍しいと思います)。

LOCK TABLES を使用してテーブルをロックできるかもしれませんが、テーブルの名前を変更するとすぐにロックが失われると思います! LOCK DATABASE は機能する可能性がありますが、ロック要求が許可される前に、他のすべてのクライアントを完全に切断する必要がある場合があります。

もちろん、これにより、テーブルの名前を変更している間、他のクライアントがブロックされますが、これはおそらく安価な操作です。

于 2009-02-09T19:51:56.183 に答える
1

他の答えは間違っています。

rename ステートメントに複数のテーブルをリストすることで、一連のテーブルの名前をアトミックに変更できます。

こちらのドキュメントを参照してください

于 2016-03-18T07:57:52.020 に答える