2013-03-21 154 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