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

时间:2011-11-08 21:56:47

标签: sql-server

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

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

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

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

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

    假设两条错误消息的错误号都是547,这样可以安全吗? 干杯 科林

2 个答案:

答案 0 :(得分: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.

话虽如此,除了外键之外,我无法想到DELETE声明可能违反的任何其他类型的约束。(帽子提示@onedaywhen )


如果您查看sys.messages,您会看到547必须违反约束条件:

select text from sys.messages where message_id=547 and language_id=1033
  

%ls语句与%ls约束“%。* ls”冲突。冲突发生在数据库“%。* ls”,表“%。* ls”%ls%。* ls%ls。

答案 1 :(得分:2)

  

Damien_The_Unbelieve:   我想不出任何其他类型的约束,   除了外键之外,DELETE语句可能会违反。

这是另一个:

CREATE TABLE T1 (ID INTEGER NOT NULL UNIQUE);
CREATE TABLE T2 
(
 ID INTEGER DEFAULT 0 NOT NULL 
 REFERENCES T1 (ID) ON DELETE SET DEFAULT
 CONSTRAINT cannot_be_zero CHECK (ID <> 0)
);
INSERT INTO T1 (ID) VALUES (1);
INSERT INTO T2 (ID) VALUES (1);
DELETE FROM T1;

生成错误:

  

消息547,级别16,状态0,行5 DELETE语句发生冲突   使用CHECK约束“cannot_be_zero”。