列でALTER TABLEを実行すると、列がNOT NULLからNULLになるのはなぜですか?


8

SQL Serverデータベースを一括更新しています。すべてのnumeric(38,0)列をint (はい、SQL ServerスクリプトはOracleスクリプトから作成されました)に変更しています。SMOとC#(私はswエンジニアです)を使用してSQL Server Management Studioのように本当に素晴らしいスクリプトを生成することができました。1つの特定の問題を除いて、すべて非常にうまく機能します。

ほんの一握りのテーブルのために、私がALTER TABLE [myTable] ALTER COLUMN [columnA] INTそれを呼び出すと、列もから変更することにしますNOT NULL to NULL。もちろん、それらの特定の列にあるほとんどのテーブルの主キーを再生成する必要があるため、これは大きな問題です。

明らかに、私はSMOを使用して、どの列が主キーであるかを見つけ、データ型の更新中または更新中にそれらを強制的にNOT NULLにする多くのオプションを持っていますが、これが何が原因であるかについては本当に興味があります。


列がT / SQLを介して主キーのメンバーであるかどうかも確認できます。SMOは必要ありません。
mrdenny、2011

回答:


10

これは、SET ANSI_NULL_DFLT_OFFまたはSET ANSI_NULL_DFLT_ONの設定によって異なります(SET ANSI_DEFAULTSからの他の効果についてもこれらをお読みください)。

個人的には、環境設定に依存せずにnullまたはnull以外の列が必要場合は、この制約を明示的に指定していました。

ALTER TABLE [myTable] ALTER COLUMN [columnA] INT NOT NULL

このコマンドを再度発行することができ、列がすでに望ましいヌル可能性にある場合、コマンドは無視されます。

ただし、主キーの一部である場合にのみ変更する必要があるとも述べました。これは、モデリング/実装フェーズから列をnullにできるかどうかには関係ありません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.