Nie jestem pewien, czy rozumiem, dlaczego to nie działa w twoim scenariuszu. Czy TIMESTAMP
gwarantowana unikalność w MS SQL Server?
Aha — widzę, że znacznik czasu SQL Server jest synonimem rowversion co jest czymś w rodzaju AUTO_INCREMENT
w MySQL z wyjątkiem tego, że generuje nową monotonicznie rosnącą wartość w UPDATE
jak również na INSERT
.
Nie, MySQL nie ma niczego takiego. MySQL nie obsługuje również SEQUENCE
obiekt taki jak Oracle, PostgreSQL lub IBM DB2. Sekwencja pozwoliłaby na przykład wygenerować nową wartość z wyzwalacza.
Przeczytałem Twoje zaktualizowane informacje w Twoim pytaniu, więc rozumiem problem, który próbujesz rozwiązać.
To, co widziałem jako alternatywne rozwiązanie, to dodanie kolejnego atrybutu w tabeli, którą przetwarzasz, nazwij go is_processed
lub coś. Wprowadź NULL podczas wstawiania nowego wiersza. Kiedy zaczniesz go przetwarzać, zmień wartość w tej kolumnie na 1. Wtedy zawsze będziesz wiedzieć, które wiersze masz jeszcze do przetworzenia — będą to wiersze, w których is_processed IS NULL
.
Odp. Twój komentarz:OK, widzę problem. Każdy użytkownik potrzebuje własnego widoku, które wiersze są nowe/zmienione.
Innym hackiem używanym w MySQL do symulowania obiektu sekwencji jest tabela zawierająca klucz podstawowy autoinkrementacji i nic więcej. Możesz wygenerować nowe, unikalne, monotonicznie rosnące wartości, wstawiając je do tej tabeli, a następnie cofnij wstawianie.
CREATE TABLE sequence (id SERIAL) ENGINE=InnoDB; -- Must be InnoDB
START TRANSACTION;
INSERT INTO sequence () VALUES (); -- Yes this is a legal statement.
ROLLBACK;
SELECT LAST_INSERT_ID();
Nie możesz rozpocząć i wycofać transakcji w wyzwalaczu MySQL, więc będziesz musiał wygenerować nowe wartości w kodzie aplikacji.
Możesz też przełączyć się na PostgreSQL i uzyskać prawdziwe wsparcie dla sekwencji.