尝试删除时出现SQL异常错误#547和外键约束违规

Kin*_*lay 6 sql-server

我正在查看一些代码(我没有写它!)来测试我们的代码在尝试删除存在依赖项的表行时捕获了两个错误条件.

代码最初在消息中查找特定文本而不是使用错误号.

为了提供多语言支持,最好根据错误号而不是错误消息捕获异常.

在测试中,代码正在寻找两组文本,我似乎无法确定区别是什么,所以只是检查错误号547是不舒服的.

  1. DELETE语句与REFERENCE约束冲突...
  2. DELETE语句与SAME TABLE REFERENCE约束冲突...

假设两个错误消息的错误号都是547是否安全?干杯科林

Dam*_*ver 8

547是用于任何约束违规的错误代码,而不仅仅是外键,例如:

create table T (
    ID int not null,
    constraint CK_Not1 CHECK (ID != 1)
)
go
insert into T (ID) values (2)
go
update T set ID = 1


(1 row(s) affected)
Msg 547, Level 16, State 0, Line 1
The UPDATE statement conflicted with the CHECK constraint "CK_Not1". The conflict occurred in database "Flange", table "dbo.T", column 'ID'.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)

话虽这么说,我想不出任何其他类型的约束,除了外键,可能会被DELETE声明侵犯.(帽子小贴士@onedaywhen)


如果您查看sys.messages,您将看到547必须是违反约束:

select text from sys.messages where message_id=547 and language_id=1033
Run Code Online (Sandbox Code Playgroud)

%ls语句与%ls约束"%.*ls"冲突.冲突发生在数据库"%.*ls",表"%.*ls"%ls%.*ls%ls中.

  • 你说 _any_ 违反约束,但是 2627 呢?这是一个独特的约束违反,不是吗?但是,`DELETE` 不会违反这一点。我认为您的意思是任何 _check_ 约束违规。 (2认同)