如何从表中的列中删除默认值?

Yis*_*hai 48 t-sql sql-server-2005

如何更改列以删除默认值?

该列创建时使用:

 ALTER table sometable Add somecolumn nchar(1) NOT NULL DEFAULT 'N'
Run Code Online (Sandbox Code Playgroud)

然后改为:

 alter table sometable alter column somecolumn nchar(1) null
Run Code Online (Sandbox Code Playgroud)

这允许空值,但默认值仍然存在.你怎么能删除它?

Dan*_*gby 46

它是一个默认约束,你需要执行:

ALTER TABLE {TableName} 
DROP CONSTRAINT ConstraintName
Run Code Online (Sandbox Code Playgroud)

如果在创建约束时未指定名称,则SQL Server会为您创建一个名称.您可以使用SQL Server Management Studio通过浏览到表,打开其树节点,然后打开"约束"节点来查找约束名称.

如果我没记错的话,约束将被命名为DF_SomeStuff_ColumnName.

编辑:Josh W.的答案包含一个SO问题的链接,该问题向您展示如何使用SQL而不是使用Management Studio界面查找自动生成的约束名称.


Yis*_*hai 13

这就是我想出来的(在看到Josh 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
Run Code Online (Sandbox Code Playgroud)

我在这里的优点是我知道整个表只有一个这样的约束.如果有两个,那么我猜这就是你应该为它们命名的原因;).

(问题在于这是对10个不同客户数据库的修改,因此在脚本中没有一个一致的名称)

  • 我相信您的解决方案不适用于具有多个默认值的表,它将删除最后一个 (2认同)
  • 如果表对不同的列有一些限制,则需要按列名进行过滤: `declare @name nvarchar(100) select * from sys.objects o join sys.columns col on o.object_id = col.default_object_id where type = ' D' and Parent_object_id = object_id('tablename') and col.name = 'columnname'` (2认同)

Mis*_*ise 9

如果您不知道约束名称

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)
Run Code Online (Sandbox Code Playgroud)

/sf/answers/960074041/


小智 6

select name from sys.default_constraints where name like '%first_3_chars_of_field_name%'
Run Code Online (Sandbox Code Playgroud)

找到您的约束并使用DROP CONSTRAINT它来删除它。或者运行一个游标/while 循环来删除数据库中所有类似的默认值。