2011-07-21 12 views
7

Mam kod z dwoma zapytaniami mysql.
DELETE FROM my_table WHERE user_id=some_number
INSERT INTO my_table (user_id, ...) VALUES(some_number, ...)insert po usunięciu błędu z powodu "duplikatu wpisu"

pole user_id jest wyjątkowy.

W rzadkich przypadkach wstawianie nie powiedzie się po zgłoszeniu zduplikowanego wpisu. Mój pierwszy instynkt prowadzi mnie do przekonania, że ​​DELETE się nie zakończyło i teraz wkładka próbuje wstawić i otrzymuję duplikat. czy to możliwe? Jak mogę tego uniknąć? Czy możliwe jest inne wytłumaczenie?

Aktualizacja: Przyczyna, którą usuwam, polega na tym, że chcę usunąć wszystkie dane, których nie aktualizuję/wstawiam po raz pierwszy. Uważam również, że ważne jest, aby stwierdzić, że większość danych pozostaje ta sama.

+0

Czy jest możliwe, że jest to stan wyścigu, w którym dwa procesy jednocześnie obsługują te dwie instrukcje dla tego samego identyfikatora? –

+0

użytkownik może być zainteresowany WYMIENNY i WSTAW ... NA instrukcji DUPLICATE KEY UPDATE –

+1

jest możliwe, że DELETE nie powiedzie się? czy jest jakiś czek po jego wykonaniu? – ascanio

Odpowiedz

1

Zawsze możesz wypróbować COMMIT po DELETE, aby upewnić się, że zostało zakończone.

+0

Po prostu muszę dodać kolejne zapytanie z "COMMIT", aby spróbować? Jeśli są wolne inne zapytania, czy będzie na nich czekać, czy mogę po prostu poprosić o czekanie na zakończenie usuwania? – Noam

+0

Tak, możesz zrobić zatwierdzenie samodzielnie. Z tego, co napisałeś o swoim kodzie, nie powinno być tak naprawdę potrzebne, ale zmusiłoby to kwestię ukończenia pierwszego oświadczenia. –

2

użyć instrukcji UPDATE Zamiast:

UPDATE my_table 
SET my_column = my_value 
WHERE user_id = some_number 
+0

Możesz (jest to wariant MySQL w składni "INSERT INTO"). Spójrz tutaj; http://dev.mysql.com/doc/refman/5.1/en/insert.html –

+0

@ypercube masz rację. –

+0

Aktualizacja nie usunie starych danych, które chcę zastąpić. Dobrze? – Noam

2
SET AUTOCOMMIT=0;  
START TRANSACTION;  
DELETE FROM my_table WHERE user_id=some_number;  
INSERT INTO my_table (user_id, ...) VALUES(some_number, ...); 
commit; 
1

Dlaczego DELETE a następnie INSERT ten sam user_id a nie tylko UPDATE wiersz?

+0

Ponieważ chcę usunąć wszystkie dane, których nie aktualizuję/wstawiam po raz pierwszy, i jestem brak aktualizacji wszystkich wierszy z tymi samymi danymi. Każdy nowy wiersz/zaktualizowany wiersz będzie miał inne dane. – Noam

-2

Dzieje się tak, ponieważ zapytanie jest traktowane jako dwie pojedyncze transakcje, więc kolejność wykonywania nie jest gwarantowana. Efekt, który opisujesz, polega na tym, że wstawka jest przetwarzana przed usunięciem. Należy zmienić logikę zapytania lub wykonać oba zapytania w ramach jednej transakcji.

Powiązane problemy