【问题标题】:Unique Key Violation in SQL Server - Is it safe to assume Error 2627?SQL Server 中的唯一键冲突 - 假设错误 2627 是否安全?
【发布时间】:2011-09-22 22:41:13
【问题描述】:

我需要通过我正在开发的 C# 应用程序以特殊方式捕获违反 UNIQUE 约束的行为。假设Error 2627 将始终对应于这种违规行为是否安全,以便我可以使用

if (ThisSqlException.Number == 2627)
{
    // Handle unique constraint violation.
}
else
{
    // Handle the remaing errors.
}

?

【问题讨论】:

    标签: sql-server-2005 unique-constraint


    【解决方案1】:

    在一个近似值内,是的。

    如果您在 MS 错误和事件站点中搜索 SQL Server 错误 2627,您应该有望到达 this page1,这表明该消息将始终涉及重复键违规(请注意部分是参数化的,而哪些不是):

    Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'.
    

    1作为@2020-06-18,Database engine errors and events 将是正确的页面

    【讨论】:

    • 您所说的“在近似范围内”是什么意思?
    • @User - 我的意思是我想不出任何其他会抱怨重复键的东西,但不幸的是,该消息是根据约束类型参数化的。
    • @Damien_The_Unbeliever,指向 [此页面] 的链接指向 Microsoft Docs 的内容。是故意的吗?
    【解决方案2】:

    2627是唯一约束(包括主键),2601是唯一索引

    SELECT * FROM sys.messages
    WHERE text like '%duplicate%' and text like '%key%' and language_id = 1033
    

    【讨论】:

    • @gbn 唯一约束和唯一索引有什么区别?两者都不强制执行索引吗?
    • technet.microsoft.com/en-us/library/aa224827(v=sql.80).aspx - 总之,我们可以安全地得出结论,唯一约束和唯一索引之间没有实际区别,除了唯一约束也在数据库中列为约束对象这一事实.
    • @bfhd 用于 SQL Server 2000。非常旧。关键与约束之间存在差异,例如 INCLUDE 和 WHERE 子句。我从不使用约束,太不灵活了,
    • 我想补充一点,message_id 可用于所有语言。因此,即使您不使用英语,返回的消息也会有所不同,但 message_id 保持不变。
    【解决方案3】:

    这是我写的一个方便的扩展方法来找到这些:

        public static bool IsUniqueKeyViolation(this SqlException ex)
        {
            return ex.Errors.Cast<SqlError>().Any(e => e.Class == 14 && (e.Number == 2601 || e.Number == 2627 ));
        }
    

    【讨论】:

    • 班级检查真的有必要吗,如果有,为什么?
    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    相关资源
    最近更新 更多