当我执行示例DELETE FROM Contact
的查询时,我想要这样做,并且在事务期间引发错误,它应该删除能够删除的行,从而引发无法删除的行的所有相关错误
答案 0 :(得分:2)
对于SQL Server,您不会在单个语句中破坏Delete命令的原子性 - 即使在显式事务之外发出,您也将在隐式事件中执行操作 - 例如你看到的全部或全部。
在显式事务的范围内,错误将默认回滚整个事务,但是可以将其更改为仅尝试并回滚在整个事务(多个语句)中出错的单个语句,此设置为SET XACT_ABORT。
由于您的删除是单个语句,XACT_ABORT无法帮助您 - 该行将出错并且将删除删除。
如果您知道要面对的错误情况(例如FK约束违规,那么您可以确保删除具有合适的where子句,以便不尝试删除您知道会产生错误的行。
答案 1 :(得分:0)
如果您使用 MySQL ,则可以take advantage of the DELETE IGNORE
syntax。
答案 2 :(得分:0)
这是一项功能,完全取决于您使用的数据库风格。有些人会有,有些则不会。
例如,Oracle为我们提供了批量记录DML错误的能力。 The example in the documentation uses an INSERT statement但同样的原则适用于任何DML语句。