2009-09-01 17 views
24

デフォルト値を削除するために列を変更するにはどうすればよいですか?テーブル内のカラムからどのようにデフォルト値を削除しますか?

カラムを作成しました:

ALTER table sometable Add somecolumn nchar(1) NOT NULL DEFAULT 'N' 

そしてで変更:

alter table sometable alter column somecolumn nchar(1) null 

nullを許可しますが、デフォルトの値が残っています。どのようにそれを取り除くことができますか?

+0

可能な複製[T-SQLではどのようにデフォルト値または同様の制約を削除しますか?](http://stackoverflow.com/questions/1123060/how-do-you-drop-a-default-value- t-sql) –

+0

VTCの可能性はありますか? –

+0

@RubenBartelink、答えの半分が答えです。Modsがマージしたいのであれば、私は気にしませんが、下の私の答えは実際に名前を発見するのではなく、どのように制約を落とすかの最後に行きます。 – Yishai

答えて

28

そのデフォルトの制約は、あなたが実行する必要があります。

ALTER TABLE 
DROP CONSTRAINT ConstraintName 

あなたが制約を作成したときに名前を指定しなかった場合、SQL Serverは、あなたのための1を作成しました。 SQL Server Management Studioを使用して、テーブルを参照し、ツリーノードを開き、制約ノードを開いて制約名を見つけることができます。

私が正しく覚えていれば、制約はDF_SomeStuff_ColumnNameの行に沿って何かという名前になります。

EDIT:Josh W.'s回答にはSO questionへのリンクが含まれており、Management Studioインターフェイスを使用する代わりにSQLを使用して自動生成された制約名を見つける方法を示しています。

10

これは私が(ジョシュW.の答えを見る前に、よく実際に私はそれを見たが、非常に速く、私はそれを誤解し、それを脱脂)思い付いたものです:

declare @name nvarchar(100) 
select @name = [name] from sys.objects where type = 'D' and parent_object_id = object_id('sometable') 

if (@name is not null) 
    begin 
    exec ('alter table [sometable] drop constraint [' + @name +']') 
    end 

私がここに持っている利点は、私が知っているということですテーブル全体にそのような制約が1つしかないということです。もし2つがあったとすれば、あなたがそれらの名前をつけることになった理由はまあまあです。

(問題があることが、これは10個の異なる顧客データベースに対して行われた変更ですので、1人の一貫性のある名前がスクリプトに入れることがないということです)

+0

それは、大規模なデータベースを展開する場合に問題になります。あなたがやらなければならないことは、環境間で一貫性を保つように、常に自分の制約に名前を付けることです。 例:ALTERテーブルsometable追加somecolumn nchar(1)NOT NULL CONSTRAINT DF_TableName_SomeColumn DEFAULT 'N' –

+1

あなたのソリューションは複数のデフォルト値を持つテーブルでは機能しないと考えられますが、最後のものは削除されます – AaA

+0

テーブルに列名によってフィルタリングする必要がある別の列に制約: '@nameのNVARCHAR(100) 宣言は oをsys.objects SELECT * FROM = o.object_id = col.default_object_id 場所種類sys.columns COLに参加'D'とparent_object_id = object_id( 'tablename') とcol.name = 'columnname'' – MirrorBoy

4
select name from sys.default_constraints where name like '%first_3_chars_of_field_name%' 

あなたの制約を検索して削除するにはDROP CONSTRAINTを使用それ。または、cursor/whileループを実行して、データベース内のすべての同様のデフォルトを削除します。

+0

私の制約は' DF_tableName_someLetters 'のような名前を持っているので、 – MirrorBoy

0
alter table <tablename> drop constraint <constraintname> 

制約名を確認するためにSQL Server Manangement Studioを使用することができる制約の名前がわからない場合は....これが役立ちます。

0

SQL Server Management Studioを使用している場合、これはかなり簡単です。

テーブルに関連付けられている制約がいくつかあり、それらをすべて削除したくない場合は、制約を右クリックして「スクリプトのCnstraintを作成する - > CREATE to - > New Query Editor Window」を選択します。これは、列名とデフォルト値を含む制約を作成したコードを表示します。

次に、削除する制約を右クリックし、[削除]を選択します。

関連する問題