1

我希望当我执行查询时,例如DELETE FROM Contact在事务期间引发错误,它应该删除能够被删除的行,从而为无法删除的行引发所有相关错误。

4

3 回答 3

2

对于 SQL Server,您不会在单个语句中破坏 Delete 命令的原子性 - 即使在显式事务之外发出,您也将在隐式事务中执行操作 - 例如,如您所见,全有或全无。

在显式事务的领域内,默认情况下错误将回滚整个事务,但这可以更改为仅尝试回滚在整个事务(多个语句的)中出错的单个语句,此设置为 SET XACT_ABORT。

由于您的 delete 是单个语句,因此 XACT_ABORT 无法帮助您-该行将出错并且 delete 将回滚。

如果您知道您将面临的错误情况(例如违反 FK 约束,那么您可以确保您的 delete 有一个合适的 where 子句,以不尝试删除您知道会产生错误的行。

于 2010-01-15T09:15:42.973 回答
0

如果你使用MySQL,你可以利用DELETE IGNORE语法

于 2010-01-15T05:28:50.017 回答
0

这是一个完全取决于您使用的数据库类型的功能。有些人会拥有它,有些人不会。

例如,Oracle 为我们提供了批量记录 DML 错误的能力。 文档中的示例使用 INSERT 语句,但相同的原则适用于任何 DML 语句。

于 2010-01-15T05:54:10.060 回答