這是一個很不錯的IMO,我還沒有在SO或Google上看到一個關閉的例子,所以在這裏你去。我需要在我正在構建的Perl應用程序中執行以下操作。不幸的是,它不能直接在MySQL中完成,並且需要DBI。簡而言之,我需要使用Database1.tableA,並找到與「開始」匹配的「狀態」列的每條記錄。我可以這樣做,因爲它很容易(DBI不太好,但已經閱讀過文檔),但是我遇到的問題是我接下來要做的。跨兩個表的Perl DBI Mysql重複行刪除
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對象的充分利用傳遞變量足夠熟悉。
我將要在這件事上所有的夜晚工作,並已通過的咖啡壺情侶跑讓你幫助我明白這個邏輯是極大的讚賞。
Database2.tableA比Database1.tableA大得多嗎?如果沒有,你幾乎肯定會更好,只需將Databases.tableA中的PKS列表導出到文件中,將它導入到Database1中的表格中,然後使用2個查詢(一個'DELETE'和一個'UPDATE',以任意順序)加入到此表中。 –
用於連接到兩個數據庫的憑證是否相同?他們在同一臺服務器上嗎?我問,因爲MySQL使用術語「數據庫」來表示什麼ANSI SQL稱爲「模式」 - 如果您的數據庫真的是模式,那麼SQL可以完成繁重的工作。 – pilcrow
同樣的服務器不同的用戶和不同的數據庫,但我需要使用DBI,因爲我們在這裏駱駝的covent。我最近設置了一個觸發器,幾乎被燒死...... – MattSizzle