【问题标题】:Force mysql to throw error if no rows deleted (trying to delete non-existent row)如果没有删除行,则强制 mysql 抛出错误(尝试删除不存在的行)
【发布时间】:2016-10-12 23:25:10
【问题描述】:

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

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

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

【问题讨论】:

  • 没有。找不到行的delete 不是错误。您可以签入modified rows = 0 的客户端代码。截断数据可能是警告或错误,具体取决于您的服务器配置。那可能是一个更好的起点。您应该为此启用严格模式,然后这将引发错误。
  • 是的,就像我说的,我想这是设计使然,这不是错误,但我希望能够以某种方式为运行 DELETE 时找不到的元组抛出错误,因为我正在使用execute_array 并检查哪些元组(如果有)未能导致删除。

标签: mysql perl dbi


【解决方案1】:

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

execute_array的回报中

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

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

【讨论】:

    猜你喜欢
    • 2015-12-25
    • 1970-01-01
    • 2014-05-29
    • 2013-07-22
    • 2014-09-11
    • 2019-03-06
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多