如果没有删除任何行(试图删除不存在的行),强制 mysql 抛出错误

Force mysql to throw error if no rows deleted (trying to delete non-existent row)

我正在使用 Perl DBI (execute_array),但我认为这更像是一个 mysql 问题。

我正在尝试 DELETE 几行,并且 运行 进入命令成功完成且没有错误的问题,但我的行没有被删除(修改行 returns 0E0,即 "zero but true",即“0 行已删除”)。当我尝试通过 PHPMyAdmin 时,行删除没有问题。经过一些调试并长时间盯着我的屏幕,我意识到我在我的 DELETE 语句中使用的列之一在添加时被截断了,这解释了为什么我的脚本找不到该行,但是 PHPMyAdmin 没有问题它。但是,这并没有解释为什么我没有收到任何错误。

所以,我想这是设计使然,但我想知道是否有办法让 mysql 在您尝试删除不存在的内容时引发错误。我知道我可以检查受影响的行数是否与提供的元组数相同,但这并没有告诉我哪些行已成功删除,哪些元组引用了不存在的行(因为我正在使用 execute_array 就是为了这个目的)。有什么想法吗?

我找到了针对我的特定用例的解决方法,并将其作为答案发布以防它对其他人有用。

在 return 中 execute_array

$sth->execute_array( { ArrayTupleStatus => \@return_vector } )

它实际上return每行一个"rows modified"值(成功时;失败时结果是一个数组引用),所以尽管它是不是真正的错误,我可以检查每个给定的元组执行是否修改了非零行(不过你需要使用 == 而不是 eq,因为 return 是 '0E0')。

if (ref $return_vector[$i])
    { print "DELETE failed, reason: $return_vector[$i][1]"; }
elsif ($return_vector[$i] == 0)
    { print "DELETE failed, no rows matched tuples"; }
else
    { print "DELETE successful"; }