W szczególności, potrzebuję usunąć niektóre wiersze z tabeli podczas iteracji nad wszystkimi wierszami w tabeli. Czy DBI ma coś podobnego do aktualizowalnego zestawu wyników w Javie? Tak więc, jeśli zrobię coś takiego:Czy można bezpiecznie aktualizować tabelę MySQL podczas iterowania zestawu wyników za pomocą narzędzia Perl DBI?
$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
}
}
... czy to w porządku?
Po to, aby podać jakiś kontekst, usuwam zduplikowane wiersze, które mają takie same wartości dla kolumn X, Y, Z, i pozostawia się tylko jeden wiersz w każdym przypadku (pierwszy znaleziony). Jeśli to było wszystko, co robiłem, po prostu ustawiłbym unikalny indeks na tych 3 kolumnach, aby wyeliminować duplikaty, ale muszę również usunąć wiersz z innej tabeli dla każdego duplikatu usuniętego z MyTable
.
Na koniec napisałem skrypt, aby zidentyfikować i zebrać wszystkie identyfikatory wierszy, które muszę usunąć w tablicy, a następnie powtórzyć tę tablicę, usuwając odpowiednie wiersze z obu tabel. Nadal jednak jestem zainteresowany znalezieniem odpowiedzi na oryginalne pytanie. Jeśli dostanę czas, spróbuję sam na to odpowiedzieć, ale jeśli ktoś już wie, że chciałbym to usłyszeć.
Powinieneś dodać wyzwalacz, który usuwa odpowiedni wiersz w tabeli pomocniczej po usunięciu wiersza z głównej tabeli. Następnie można dodać unikalne ograniczenie – Borodin
To wydaje się dobrym rozwiązaniem, ale w rzeczywistości nie będzie odpowiednie dla mnie. Moje wymagania zmieniły się nieznacznie, ponieważ muszę trzymać się ostatniego duplikatu dodanego do tabeli zamiast pierwszego, i myślę, że jedyne ograniczenie utrzymuje tylko pierwsze. – RTF