【问题标题】:SQL CONSTRAINT different nameSQL 约束不同的名称
【发布时间】:2017-04-18 03:19:41
【问题描述】:

我有两个具有完全相同表的数据库,但它们在约束方面有所不同。详情请看下图。

如您所见,SRO_VT_SHARD_188_RefObjChar 有一个约束,但 SRO_VT_SHARD_D9 没有。

我在SRO_VT_SHARD_D9 中删除了表_RefObjChar 并用一个充满约束的查询重新创建了它,但我收到了这个错误:

数据库中已经有一个名为“DF__RefObjChar_Resist27”的对象。

我知道如果我将 CONSTRAINT 的名称更改为 DF__RefObjChar_Resist27AAA,我的查询可以正常运行,但我想知道如果我这样做,是否会导致任何查询错误或由于旧的 CONSTRAINT 名称已更改而无法正常工作?

【问题讨论】:

  • 约束名称是数据库范围的。或架构范围。或类似的东西;无论如何都不同于索引名称。 DF_TableName_ColumnName 你会没事的——就像外键一样:FK_ForeignTable_PrimaryTable.
  • 但是如果我改成DF_TableName_ColumnName_SomeString这样的名字也可以吗?
  • 如果您更改约束的名称,您的查询应该不会有任何问题(我认为您需要删除并重新创建它)。除非您有某种查询会在正常操作中改变数据模型的结构,这会触及这些约束(极不可能,我不知道为什么应该有)。

标签: sql-server constraints


【解决方案1】:

如 cmets 中所述,约束是数据库范围的。您甚至不知道是否在此特定表上定义了相关约束。运行下面的查询(或类似的)以找出约束的使用位置。始终最好以声明方式命名您的约束,也如 cmets 中所述,而不是让它们由系统或工具命名。我倾向于<schema>__<object>__<column>__<type>。所以这将是 [dbo__SRO_VT_SHARD_DN__df]。现在,您的约束名称清楚地表明了它的使用位置和方式。请注意,我使用双下划线来分隔模式、对象、列、类型,因为单下划线经常用于名称中。您可能会使用不同的符号。关键是使命名尽可能明显。是架构 [address_state] 和表 [city] 列类型的 [address_state_city_type_df],还是架构 [address]、表 [state_city] 等的 [address_state_city_type_df]。

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'; 

【讨论】:

    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多