这是一个非常好的 IMO,我还没有在 SO 或 Google 上看到过类似的例子,所以你去吧。我需要在我正在构建的 Perl 应用程序中执行以下操作。不幸的是,它不能直接在 MySQL 中完成,需要 DBI。简而言之,我需要使用 Database1.tableA 并找到与列“状态”匹配“开始”的每条记录。我可以这样做,因为它相当容易(DBI 还不是很好,但已经阅读了文档),但是我遇到问题的地方是我接下来要做的。
my $started_query = "SELECT primary_ip FROM queue WHERE status='started'";
my $started = $dbh->prepare($started_query);
$started->execute();
while ( my @started = $started->fetchrow_array() ) {
# Where I am hoping to have the following occur so it can go by row
# for only rows with the status 'started'
}
所以对于@started数组中的每条记录,每次while循环的迭代实际上只包含一个值,我需要看看它是否存在于Database2.tableA中,如果它确实存在于我需要的另一个数据库(Database2.tableA)中从 Database1.tableA 中删除它,但如果它在另一个数据库 (Database2.tableA) 中不存在,我需要更新当前数据库 (Database1.tableA) 中的记录。
基本上复制了以下半有效的 MySQL 语法。
DELETE FROM tableA WHERE primary_ip IN (SELECT primary_ip FROM db2.tablea) OR UPDATE tableA SET status = 'error'
我仅限于 DBI 连接到两个数据库,目前逻辑正在逃避我。我可以对两个数据库进行查询并存储在@arrays 中,然后进行比较,但这似乎是多余的,因为我认为这应该是可能的,while ( my @started = $started->fetchrow_array() )
因为这将节省运行时和所需的资源。我对在 DBI 实例之间传递变量也不够熟悉,因为 @started 数组将始终包含我需要查询和删除的列值,我想充分利用已定义并传递给 DBI 对象的优势。
我将整晚都在做这件事,并且已经喝了几壶咖啡,所以非常感谢你帮助我理解这个逻辑。