web-dev-qa-db-ja.com

SQL Server Management Studio-列の追加/移動にはドロップと再作成が必要ですか?

列を追加/移動するときにテーブルを削除して再作成する必要があるというメッセージが表示されるのはなぜですか?これは、外部キー制約を追加した後に発生すると思います。

テーブルを削除せずに新しい列を追加するにはどうすればよいですか?

18
tvr

"Prevent saving changes that require table re-creation"

単にSSMSで通知が停止しないようにしたい場合は、[オプション]-> [デザイナー]-> [テーブルとデータベースデザイナー]の[テーブルの再作成が必要な変更を保存できないようにする]設定をオフにします。テーブルは引き続き削除されて再作成されますが、少なくともSSMSはそれについてそれほど悩まされることはありません。

(これは、開発/テスト環境またはテーブルの存在が少しの間経過しても何も失敗しない本番環境で作業していることを前提としています)

24
John Rose

それがSQL Server Management Studioが(時々)行う方法だからです!

代わりにTSQLの ALTER TABLE を使用します。

ALTER TABLE
    ADD myCol int NOT NULL
9
Mitch Wheat

SQL Server(およびその他のRDBMS)には、「列の順序」という概念はありません。列を移動する場合、新しいテーブル構造を実現する唯一の方法は、新しいCREATE TABLEステートメントを発行することです。他の方法で列を並べ替えることはできません。また、関係理論では、タプルの列の順序は関係ないため、実際にはそうすべきではありません。

そのため、SQL Server Management Studioで実行できる唯一の(そして、これまでずっと行ってきた)ことは次のとおりです。

  • 古いテーブルの名前を変更します
  • 希望する新しいレイアウトで新しいテーブルを作成します
  • 古いテーブルからデータをコピーする
  • 古いテーブルを落とす

これを回避する唯一の方法は次のとおりです。

  • 列を並べ替えない-テーブルの最後に新しい列を追加するだけ
  • インタラクティブなテーブルデザイナーの代わりにALTER TABLE SQLステートメントを使用して作業します
1
marc_s

デザイナでテーブル定義を編集するとき、「ここにテーブルを表示したいのですが、ここで、希望を実現するために発行するSQLステートメントを考え出します」と言っています。これは単純な変更では問題なく機能しますが、ソフトウェアはあなたの心を読み取ることができず、安全のためにもっと複雑な方法で物事を実行しようとすることがあります。

これが発生した場合は、単に[OK]をクリックする代わりに、ダイアログの上部にある[スクリプト]ボタンをクリックして、SQLステートメントをクエリウィンドウに生成することをお勧めします。次に、生成されたコードを実行する前に編集および簡略化できます。

0

SSMS 2008 R2(およびそれ以前)には、知っておくと便利なバグがあります。

  • テーブルデータが変更されると、SSMSでのレンダリングはSSMSによって既に開いているタブ(ウィンドウ)で自動更新されます。更新するにはCtrl + Rを押す必要があります。更新を強制するオプションは、SSMS GUIには表示されません-ボタン、メニュー、または状況依存オプション(右クリック時)を使用します
  • テーブル内の列の追加/削除/削除などの(テーブルまたはデータベース)スキーマが変更された場合、SSMSはCtrl + Rを使用してもすでに開いているタブ(ウィンドウ)にこれらの変更を反映しません。タブ(ウィンドウ)を閉じて再度開く必要があります。 )

数年前にMicrosoftConnectのフィードバックで報告しましたが、「仕様による」ためバグはクローズされました。

更新:
これは、20年間に開発されたデスクトップ製品で見られるのは奇妙で刺激的ですが、これ(自動更新)は、どのブラウザーのほとんどのWebアプリケーションでも実行されています。