gpt4 book ai didi

perl - 使用 Perl DBI 迭代结果集时更新 MySQL 表是否安全?

转载 作者:行者123 更新时间:2023-12-04 15:56:12 26 4
gpt4 key购买 nike

具体来说,我需要在迭代表中的所有行时从表中删除一些行。 DBI 是否有类似 Java 中可更新结果集的功能?所以,如果我做这样的事情:

$query_all = $dbh->prepare("select Id, X, Y, Z from MyTable");
$delete = $dbh->prepare("delete from MyTable where Id = ?");
$query_all->execute();

while ( my @res = $query_all->fetchrow_array() ){
my ($id, $x, $y, $z) = @res;
# fetch the IDs of any other rows that have the same X, Y, Z values
foreach ( the_duplicate_ids ){
$delete->execute($dup_id); # safe ??
# also delete from another table using $dup_id
}
}

...这可以吗?

只是为了提供一些上下文,我删除了 X、Y、Z 列具有相同值的重复行,并且在每种情况下只留下一行(找到的第一行)。如果这就是我所做的一切,我只需在这 3 列上设置一个唯一索引以消除重复项,但对于从 MyTable 中删除的每个重复项,我还需要从另一个表中删除一行。 .

最后,我编写了一个脚本来识别和收集我需要删除的行的所有 ID 到一个数组中,然后遍历该数组,从两个表中删除相关行。不过,我仍然有兴趣找到原始问题的答案。如果我有时间,我会尝试自己回答,但如果有人已经知道,我想听听。

最佳答案

您担心并发修改错误?

如果您正在使用事务,那么只要您在完成迭代后保存提交,就不会出现问题。

但是,如果您使用自动提交,则可能会出现问题,因此解决方案是:

伪代码 ish -- 未测试

#Loop through each row and note the records to delete
my @deathrow = ();
foreach my $row ( @resultset ) {
push $row->{id}, @deathrow;
}

#Now that we're done iterating, do all the deletes in one statement
$dbh->execute("DELETE WHERE id IN ( " . @deathrow . " )"); #something like that

关于perl - 使用 Perl DBI 迭代结果集时更新 MySQL 表是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32307846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com