我有两个数据库,它们具有完全相同的表,但它们在约束方面不同。详细请看下图。
如您所见,
SRO_VT_SHARD_188
对 _RefObjChar
有约束,但 SRO_VT_SHARD_D9
没有。
我已删除
_RefObjChar
中的表 SRO_VT_SHARD_D9
并使用充满约束的查询重新创建它,但我收到此错误:
数据库中已有一个名为“DF__RefObjChar_Resist27”的对象。
我知道如果我将 CONSTRAINT 的名称更改为
DF__RefObjChar_Resist27AAA
,我的查询可以运行而不会出现错误,但我想知道如果我这样做,是否会导致任何查询错误或由于旧 CONSTRAINT 的名称已更改而无法正常工作?
正如评论中所指出的,约束是数据库范围内的。您甚至不知道所讨论的约束是否在此特定表上定义。运行下面的查询(或类似的查询)以找出使用约束的位置。最好以声明方式命名约束(也如注释中所述),而不是让它们由系统或工具命名。我倾向于
<schema>__<object>__<column>__<type>
。所以这将是 [dbo__SRO_VT_SHARD_DN__df]。现在,您的约束名称清楚地表明了它的使用位置和方式。请注意,我使用双下划线来分隔架构、对象、列、类型,因为名称中经常使用单下划线。您可以使用不同的符号。重点是使命名尽可能明显。是 [address_state_city_type_df] 用于架构 [address_state] 和表 [city] 列类型,还是用于架构 [address]、表 [state_city] 等
select [default_constraints].[name]
, [objects].[name]
, [objects].[type_desc]
, [columns].[name]
from [sys].[default_constraints] as [default_constraints]
join [sys].[objects] as [objects]
on [objects].[object_id] = [default_constraints].[parent_object_id]
join [sys].[columns] as [columns]
on [columns].[column_id] = [default_constraints].[parent_column_id]
where [default_constraints].[name] = N'DF__RefObjChar_Resist27';