【问题标题】:How can I check if the values were changed after an update?如何检查更新后值是否更改?
【发布时间】:2014-04-15 01:53:03
【问题描述】:

假设我执行以下操作:

my $rows = $dbh->do("UPDATE MYTABLE SET amount=1200 WHERE id =123"); 

$rows 返回 1,即使金额已经为 1200。因此它被视为更新的行。
我的问题是:除了在更新之前进行查询之外,有没有办法检查更新是否真的改变了一行中的值?

【问题讨论】:

    标签: mysql sql perl sql-update


    【解决方案1】:

    默认情况下,DBD::mysql 返回UPDATE匹配的行数,而不是物理更改的行数。您可以通过在调用 connect 时禁用 mysql_client_found_rows 来更改此行为:

    my $dsn = "DBI:mysql:;mysql_client_found_rows=0";
    my $dbh = DBI->connect($dsn, $user, $password);
    

    【讨论】:

    • 正是我想要的。
    【解决方案2】:

    Twinkles 答案是正确的,但您应该使用prepare 创建语句句柄,然后使用execute 来创建大部分数据库查询。

    在这种情况下,你会写

    my $update_if_changed = $dbh->prepare('UPDATE mytable SET amount = ? WHERE id = ? AND amount != ?')
    

    随后

    $update_if_changed->execute($amount, $id, $amount)
    

    【讨论】:

      【解决方案3】:

      将 SQL 查询更改为:

      UPDATE MYTABLE SET amount=1200 WHERE id = 123 AND amount <> 1200
      

      该表将是相同的,但它返回实际更改的行数。

      【讨论】:

      • 无需更改查询,因为 MySQL 已经跟踪了UPDATE 中匹配的行数实际更改的行数。您只需要告诉它要报告哪个值,您可以使用 DBD::mysql 中的mysql_client_found_rows 来完成。
      • 是的,但我的解决方案具有独立于供应商的优势。
      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2018-06-04
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多