2013-03-21 114 views
24

我試圖在SQL Server 2008中使用SQL語句更改列的默認值。我在許多地方發現如何在創建表/添加時設置默認值一列,但沒有如何設置它/修改它,一旦列已經存在。在SQL Server中修改默認值

這是我可以用它來設置它補充說:

ALTER TABLE MyTable ADD MyColumn int NOT NULL DEFAULT 0 

而且這樣的作品,但如果我嘗試再進行修改:那些

ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL DEFAULT -1 
ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL SET DEFAULT -1 

都不是語法正確,我沒有找到用來做我在任何地方假裝的語法。我唯一的選擇是添加一個新列,從前一列複製值,然後刪除前一列和新列以進行更改,但這對我來說看起來並不正確。

有沒有一種方法可以在一個簡單的句子中做我想做的事情?

謝謝。

回答

45

當您添加具有默認值的列,會發生什麼情況是,有被添加默認約束:

create table _temp 
(x int default 1) 

sp_help結果:

constraint_type constraint_name 
DEFAULT on column x DF___temp__x__5A3B20F9 

所以這個子句是創建約束的捷徑。如果你想修改默認已有列,你必須先刪除約束:

alter table _temp drop constraint DF___temp__x__5A3B20F9 

,然後創建一個新的默認約束:

alter table _temp add constraint DF_temp_x default 2 for x 
+9

我只會添加如何獲得約束名稱給你的解釋: SELECT NAME FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('dbo.MyTable'); 只要做到這一點,將幫助您知道刪除/再次添加哪個約束。 – 2013-03-21 12:31:07

+4

這清楚地表明瞭爲什麼它明確地命名你的約束是如此重要!想象一下你想放棄這個限制....如果你知道它叫做'DF_Temp_X'(而不是系統生成的'DF___ temp__x__5A3B20F9'),那麼它有多容易。 – 2013-03-21 12:36:49

+3

@ Ruben.Canton:「sp_help TABLE_NAME」也可以。 – 2013-03-21 12:36:51

10

你應該刪除缺省約束,並添加這樣

alter table Mytable 
drop constraint <constraint name> 
go 
alter table MyTable 
add constraint df_MyTable_MyColumn default -1 for MyColumn 
go 

使用sp_helpconstraint MyTable的一個新得到約束名

+0

我現在明白了,其他頁面也在談論約束條件,但我沒有詳細閱讀並期待在發言中,我認爲這是回答不同的事情。感謝您的澄清。 – 2013-03-21 12:22:26

5

DEFAULT是一種約束。你想使用ALTER TABLE ADD CONSTRAINT

ALTER TABLE MyTable 
ADD CONSTRAINT <constraint name> 
DEFAULT -1 FOR MyColumn 

你需要先刪除當前的約束,如:

ALTER TABLE MyTable 
DROP CONSTRAINT <constraint name> 
22
DECLARE @Command nvarchar(max), @ConstaintName nvarchar(max), @TableName nvarchar(max),@ColumnName nvarchar(max) 
SET @TableName = 'TableName' 
SET @ColumnName ='ColumnName' 
SELECT @ConstaintName = name 
    FROM sys.default_constraints 
    WHERE parent_object_id = object_id(@TableName) 
     AND parent_column_id = columnproperty(object_id(@TableName), @ColumnName, 'ColumnId') 

SELECT @Command = 'ALTER TABLE '[email protected]+' drop constraint '+ @ConstaintName 

IF @Command IS NOT NULL 
BEGIN 
    EXECUTE sp_executeSQL @Command 
    SELECT @Command = 'ALTER TABLE '[email protected]+' ADD CONSTRAINT '[email protected]+' DEFAULT 1 FOR ' + @ColumnName 
    EXECUTE sp_executeSQL @Command 
END 
+5

不知道爲什麼這是downvoted。這似乎是一個相當完善的解決方案... – 2014-06-18 15:12:00

+2

@LukasEder可能是由於SQL Server在約束名稱是系統生成時需要刪除默認值的代碼量的反應。 PostgreSQL:ALTER TABLE TableName ALTER COLUMN ColumnName DROP DEFAULT; – MrBackend 2015-07-02 12:31:58

0

添加默認值,如果列它不存在

DECLARE @defaultLock VARCHAR(100) 
SELECT @defaultLock = (SELECT object_definition(default_object_id) AS definition FROM sys.columns WHERE name = 'Lock' AND object_id = object_id('dbo.Positions')) 
    IF @defaultLock IS NULL 
     ALTER TABLE Positions ADD DEFAULT (0) FOR Lock