如何从表中的列中删除默认值?
如何从表的列中删除默认值?
在修改十个不同的客户数据库时,出现了一个问题:没有一个一致的名称可以放入脚本中。这对于任何大规模的数据库推出来说都是一个问题。你最终不得不迫使自己始终为约束命名,以便在各个环境中保持一致。例如:ALTER表sometable添加somecolumn nchar(1) NOT NULL CONSTRAINT DF_TableName_SomeColumn DEFAULT 'N'
如果表上有多个默认值约束,你的解决方案将无法工作,它只会删除最后一个默认值。如果表对不同的列有约束,则需要按列名进行过滤:
declare @constraintName nvarchar(100) select @constraintName = 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('tablename') and col.name = 'columnname'
这是我想出的解决方案(在看到Josh W.的答案之前,实际上我看到了,但是我浏览得太快,误解了它):
declare @constraintName nvarchar(100) select @constraintName = [name] from sys.objects where type = 'D' and parent_object_id = object_id('sometable') if (@constraintName is not null) begin exec ('alter table [sometable] drop constraint [' + @constraintName +']') end
更新:如果表上的不同列有默认约束,第二行应该根据MirrorBoy下面的评论进行更改:
select @constraintName = 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'
我在这里的优势是我知道整个表中只有一个这样的约束。如果有两个的话,我猜这就是为什么你应该给它们命名的原因。
解决方法就是根据约束名称来删除约束。使用sys.objects和sys.columns系统表来获取约束名称。如果表上有多个默认值约束,需要根据列名进行过滤。然后使用ALTER TABLE语句来删除约束。
从上面的内容中可以看出,这个问题的出现原因是需要在表的列中删除默认值。在这个例子中,问题的解决方法是使用以下步骤:
1. 首先,需要找到默认约束的名称。可以使用以下代码查询默认约束的名称:
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__'))
在这个代码中,`__TableName__`和`__ColumnName__`是需要删除默认值的表名和列名。
2. 然后,需要判断默认约束的名称是否为空。如果不为空,执行以下代码删除默认约束:
IF @constraintName IS NOT NULL EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @constraintName)
同样,`__TableName__`是需要删除默认值的表名。
通过以上步骤,就可以成功删除表的列中的默认值。这个解决方法可以在stackoverflow的链接中找到:https://stackoverflow.com/a/13715343/2547164
在SQL Server中,如果要从表的列中删除默认值,可以执行以下操作:
ALTER TABLE {TableName} DROP CONSTRAINT ConstraintName
如果在创建约束时没有指定名称,SQL Server会自动创建一个名称。可以使用SQL Server Management Studio浏览到表,打开其树节点,然后打开Constraints节点来查找约束名称。
如果我记得正确的话,约束的名称可能类似于DF_SomeStuff_ColumnName。
编辑:Josh W.的答案中包含了一个链接,链接到一个SO问题,该问题展示了如何使用SQL而不是使用Management Studio界面来查找自动生成的约束名称。
可以使用sp_help 'table_name'
在SQL Server中获取约束的名称。