在SQL Server中重命名约束?

113

在SQL Server中是否可以重命名约束?我不想删除并创建一个新的约束,因为这个约束会影响到其他已经存在的约束,我需要重新创建或修改这些约束。

7个回答

108

经过进一步调查,我发现实际上它必须以这种形式存在:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint', N'OBJECT'

来源


7
这是更精确的答案。其他形式之所以有效,是因为大多数人会将所有表都转储到默认架构(通常为“dbo”),因此您可以省略默认架构。但如果您使用多个架构,则此语法是正确的(您始终可以指定“dbo”)。 - Godeke
从源代码来看,似乎您不需要N'OBJECT'引用。 - Abrham Smith

85
您可以使用 sp_rename 来重命名 @objtype = 'OBJECT' 中的对象。
此方法适用于在sys.objects中列出的对象,包括约束条件。

16
万一你不能使这个工作起来,MSDN 上写道:“重命名约束时,必须指定约束所属的模式。” - Black Light
1
对于 PK 约束,无需指定 @objtype = 'OBJECT'。只需指定旧名称和新名称即可。 - pkuderov

56
你可以使用 sp_rename
sp_rename 'CK_Ax', 'CK_Ax1'

3
+1 这是 SSMS 在重命名约束时使用的内容。对于 PK 约束,它将 INDEX 作为对象类型传递。 - Martin Smith
3
需要注意的是,与主键不同,CHECK约束在进行第一个sp_rename参数时不需要表前缀,如果使用表前缀,则会失败。 - mattmc3

9

回答是正确的:

exec sp_rename 
@objname = 'Old_Constraint',
@newname = 'New_Constraint',
@objtype = 'object'

7

我知道这是一个老问题,但是我刚刚发现以下内容非常有帮助,除了其他很棒的答案:

如果要重命名的约束条件中有句点(dot),那么您需要用方括号括起来,就像这样:

sp_rename 'schema.[Name.With.Period.In.It]', 'New.Name.With.Period.In.It'

3
还有,不要在新名称中加方括号。否则您可能会得到一个包含括号的名称。 - casenonsensitive
你也可以使用 QUOTENAME()。例如:sp_rename 'schema.' + QUOTENAME('Name.With.Period.In.It'), 'New.Name.With.Period.In.It'。当对象的名称存储在变量中而不是手动输入时,这非常有用。 - br3nt

2
这个东西怎么样?
ALTER TABLE schema.table_name RENAME CONSTRAINT old_fk1 TO new_fk11;

0

如果你像我一样在运行创建表查询时遇到了“约束已存在”的错误消息,那么可能的原因也与我的情况相同。

当我们的团队将数据库结构更新到生产环境时,我们陷入了困境,因为无法创建一个新表。

我们发现这个表实际上是一个已经被重命名的旧表,因此该表已经以旧名称存在于生产环境中。

所以你的选择是在生产环境中重命名表。或者删除它然后创建新表。


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