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

时间:2016-06-12 13:04:30

标签: mysql perl dbi

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

我正在尝试DELETE几行,并遇到命令成功完成且没有错误的问题,但我的行没有被删除(修改的行返回0E0,即"零但是真的",即" 0行被删除")。当我尝试通过PHPMyAdmin时,删除的行没有任何问题。在我的屏幕上进行了一些调试和长时间的空白后,我意识到我在DELETE语句中使用的一个列在添加时被截断了,这解释了为什么我的脚本无法找到该行,但是PHPMyAdmin没有问题。它。但是,这并没有解释为什么我没有收到任何错误。

所以,我想这是设计的,但我想知道当你试图删除不存在的东西时,是否有办法让mysql引发错误。我知道我可以检查受影响的行数是否与提供的元组数相同,但这并不能告诉我哪些行被成功删除,以及哪些元组引用了不存在的行(因为我正在使用{ {1}}为了这个目的)。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

execute_array

的回报中
$sth->execute_array( { ArrayTupleStatus => \@return_vector } )

它实际上会返回"行修改的"值每行(成功时;当它失败时结果是一个数组引用),所以虽然它实际上不是一个错误,但我可以检查每个给定的元组执行是否修改了非零行(你但是,需要使用== not eq,因为返回的是' 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"; }