2009-09-01 40 views
24

你如何改變一列來刪除默認值?如何從表中的列中刪除默認值?

柱用創建:

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

然後用修改:

alter table sometable alter column somecolumn nchar(1) null 

允許空值,但默認值保持。你怎麼能刪除它?

+0

可能重複[如何在T-SQL中刪除默認值或類似約束?](http://stackoverflow.com/questions/1123060/how-do-you-drop-a-default-value- or-similar-constraint-in-t-sql) – 2013-11-01 10:40:08

+0

VTC有什麼可能嗎? – 2013-11-01 10:51:48

+0

@RubenBartelink,答案是一半的解決方案。如果Mods想要合併,我不介意,但我的回答實際上是如何放棄約束的結果,而不是僅僅發現名稱。 – Yishai 2013-11-01 13:15:07

回答

28

它的默認約束,你需要執行:

ALTER TABLE 
DROP CONSTRAINT ConstraintName 

如果您在創建約束沒有指定名稱,則SQL Server中創建一個給你。您可以使用SQL Server Management Studio通過瀏覽表格,打開其樹節點,然後打開約束節點來查找約束名稱。

如果我沒記錯的話,這個約束將被命名爲DF_SomeStuff_ColumnName。

編輯:Josh W.'s答案包含指向SO question的鏈接,該鏈接顯示如何使用SQL查找自動生成的約束名稱,而不是使用Management Studio界面。

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 

的優點我這裏,我知道整個桌子上只有一個這樣的限制。如果有兩個,那麼我想這就是爲什麼你應該命名他們;)。

(的問題是,這是10個不同的客戶數據庫進行了修改,所以沒有放在一個腳本一個一致的名稱)

+0

是的,這將成爲任何大規模數據庫推出的問題。你最終必須做的是強迫自己始終命名你的約束,以便它們在不同的環境中保持一致。 例如:ALTER table sometable添加somecolumn nchar(1)NOT NULL CONSTRAINT DF_TableName_SomeColumn DEFAULT'N' – 2009-09-01 21:43:15

+1

我相信你的解決方案不能在具有多個默認值的表上工作,它將刪除最後一個 – AaA 2014-04-22 01:44:39

+0

如果表有一些約束到不同的列,有必要通過柱名稱過濾: '聲明@name nvarchar的(100) SELECT * FROM sys.objects中ø 加入SYS.COLUMNS山坳上o.object_id = col.default_object_id 其中 類型= 'D'和parent_object_id = object_id('tablename') 和col.name ='columnname'' – MirrorBoy 2017-11-08 15:28:35

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

找到你的約束,並使用DROP CONSTRAINT下降它。或者運行一個遊標/ while循環來刪除數據庫中所有類似的默認值。

+0

它不起作用,因爲我的約束名稱有'DF_tableName_someLetters' – MirrorBoy 2017-11-08 15:26:21

0
alter table <tablename> drop constraint <constraintname> 

如果您不知道約束的名稱,您可以使用sql server manangement studio來檢查約束名....希望這有助於。

0

如果您使用的是SQL Server Management Studio,這非常簡單。

如果有幾個與表相關的約束,並且您不想全部刪除它們,請右鍵單擊約束並選擇「Script Cnstraint as - > CREATE to - > New Query Editor Window」。這會向您顯示創建約束的代碼,包括列名和默認值。

然後只需右鍵單擊要刪除的約束並選擇刪除。