我正在尝试使用SQL Server 2008中的SQL语句更改列的默认值。我在很多地方发现如何在创建表/添加列时设置默认值但不是如何设置在列已经存在后设置/修改它。
这是我可以用来设置添加的内容:
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
这些都没有语法正确,我找不到语法来做我假装的任何地方。我唯一的选择是添加一个新列,复制上一列中的值,然后删除上一列和新列以进行更改,但这对我来说似乎不对。
有没有办法只用一个简单的句子做我想做的事情?
感谢。
答案 0 :(得分:55)
当您添加具有默认值的列时,会发生的是创建默认约束:
create table _temp
( x int default 1)
sp_help
结果:
constraint_type constraint_name
DEFAULT on column x DF___temp__x__5A3B20F9
因此列定义中的default子句只是创建约束的快捷方式;默认值不是列的固有属性。如果要修改现有列的默认值,则必须先删除约束:
alter table _temp drop constraint DF___temp__x__5A3B20F9
然后创建一个新的默认约束:
alter table _temp add constraint DF_temp_x default 2 for x
答案 1 :(得分:27)
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 '+@TableName+' DROP CONSTRAINT '+ @ConstaintName
EXECUTE sp_executeSQL @Command
SELECT @Command = 'ALTER TABLE '+@TableName+' ADD CONSTRAINT '+@ConstaintName+' DEFAULT 1 FOR ' + @ColumnName
EXECUTE sp_executeSQL @Command
答案 2 :(得分:11)
你应该删除DEFAULT约束并添加一个像这样的新约束
alter table Mytable
drop constraint <constraint name>
go
alter table MyTable
add constraint df_MyTable_MyColumn default -1 for MyColumn
go
使用sp_helpconstraint MyTable获取约束名称
答案 3 :(得分:5)
DEFAULT
是一种约束。您想使用ALTER TABLE ADD CONSTRAINT
。
ALTER TABLE MyTable
ADD CONSTRAINT <constraint name>
DEFAULT -1 FOR MyColumn
您需要先删除当前约束,例如:
ALTER TABLE MyTable
DROP CONSTRAINT <constraint name>
答案 4 :(得分:1)
为列添加默认值(如果不存在)
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
答案 5 :(得分:0)
我不得不在现有数据库中的许多字段上更改默认约束,因此想一次完成。希望这会有所帮助...
select 'USE ' + DB_NAME()
SELECT 'ALTER TABLE '+ src3.name + '.' + src1.name +' drop constraint '+ src.name + '
ALTER TABLE ' + src3.name + '.' + src1.name +' ADD CONSTRAINT '+ src.name + ' DEFAULT getutcdate() FOR ' + src2.name -- amend default constrint accordingly.
FROM sys.tables src1
inner join sys.schemas src3
on src3.schema_id = src1.schema_id
inner join sys.columns src2
on src2.object_id = src1.object_id
inner join sys.default_constraints src
on src.parent_column_id = src2.column_id
and src.parent_object_id = src1.object_id
WHERE (-- pick up existing constraint definition
src.definition like '%getdate%'
or src.definition like '%current\_timestamp%' escape '\'
)
and src1.type = 'U'
order by src3.name + '.' + src1.name
很显然,您需要修改查询并将输出复制到另一个选项卡中以执行。