具体来说,我需要在迭代表中的所有行时从表中删除一些行。 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 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!