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

77

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

该列是使用以下方式创建的:

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

然后被改变为:

 alter table sometable alter column somecolumn nchar(1) null

这允许使用null,但默认值仍然存在。如何删除它?


可能是如何在T-SQL中删除默认值或类似约束?的重复问题。 - Ruben Bartelink
@RubenBartelink,那里的答案只解决了问题的一半。如果Moderator想合并,我不介意,但是我下面的答案实际上涉及了如何删除约束到底,而不仅仅是发现其名称。 - Yishai
我们可以有不同的看法,但是对我来说https://dev59.com/znNA5IYBdhLWcg3wBo9m#10758357回答得非常完美,而且4个相同的问题只是浪费时间,让人感到烦恼。 - Ruben Bartelink
@RubenBartelink,它可能没有特别涉及默认约束,我认为我需要测试一下。 - Yishai
@RubenBartelink,好的,我相信你的话。我没有时间去检查。 - Yishai
显示剩余2条评论
7个回答

79

这是一个默认约束,您需要执行以下操作:

ALTER TABLE {TableName} 
DROP CONSTRAINT ConstraintName

如果在创建约束时没有指定名称,SQL Server会为您创建一个名称。您可以使用SQL Server Management Studio通过浏览表、打开其树节点,然后打开约束节点来查找约束名称。
如果我没记错的话,约束的名称将类似于DF_SomeStuff_ColumnName。
编辑:Josh W.的答案包含一个链接到SO问题,该问题展示了如何使用SQL而不是使用Management Studio界面来查找自动生成的约束名称。

在SQL Server中,您可以使用sp_help 'table_name'获取约束的名称。 - Warios

21

如果您不知道限制名称

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)

https://dev59.com/IGoy5IYBdhLWcg3wScTb#13715343


16
这是我想出来的(在看到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

更新:如果表格的不同列上有默认约束条件,则应根据MirrorBoy在下面的评论中提出的建议更改第二行。
select @name = o.name 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('sometable') and col.name = 'someColumn' 

我在这里的优势是我知道整个表上只有一个这样的约束。如果有两个的话,我猜这就是为什么你应该给它们命名的原因;)。
(问题是这是对10个不同客户数据库进行的修改,所以没有一个一致的名称可以放在脚本中)

1
是的,这对于任何大规模数据库部署都会成为一个问题。你最终不得不强制自己始终命名约束,以便它们在各个环境中保持一致。例如:ALTER TABLE sometable ADD somecolumn nchar(1) NOT NULL CONSTRAINT DF_TableName_SomeColumn DEFAULT 'N' - Dan Rigby
2
我相信你的解决方案在处理有多个默认值的表格时不会生效,它会移除最后一个默认值。 - AaA
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' - MirrorBoy

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

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

1
它无法工作,因为我的约束名称类似于“DF_tableName_someLetters”。 - MirrorBoy

1
如果您正在使用SQL Server Management Studio,这很容易做到。
如果有几个与表相关的约束,并且您不想将它们全部删除,请右键单击约束并选择“生成脚本为->创建到->新查询编辑器窗口”。这将显示创建约束的代码,包括列名和默认值。
然后只需右键单击要删除的约束并选择“删除”即可。

0

我也遇到了同样的问题,并且像你一样修改了表格并添加了默认值。但是以上解决方案都没有解决我的问题,因为尽管刷新了多次,默认值仍然未在约束列表中列出,但是在插入表格时却起到了作用。

最后,我通过在SQL Management Studio中右键单击表格名称并选择“设计”来解决了这个问题。然后,我在列属性中删除了那里的默认值。


-2
alter table <tablename> drop constraint <constraintname>

如果你不知道约束的名称,可以使用SQL Server管理工具来查看约束的名称...希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接