2012-02-16 16 views
8

Widziałem rozwiązania do aktualizacji sekwencji, gdy nie są one zsynchronizowane z kluczem podstawowym, który generuje, ale nie rozumiem, jak ten problem występuje w pierwszej kolejności.Dlaczego sekwencje id SQL idą niezsynchronizowane (w szczególności przy użyciu PostgreSQL)?

Czy ktoś ma wgląd w to, w jaki sposób pole klucza podstawowego, z jego domyślnym określeniem jako nextval sekwencji, którego klucze podstawowe nie są jawnie ustawione nigdzie, może zsynchronizować się z sekwencją? Używam PostgreSQL i widzimy, że zdarza się to od czasu do czasu. Powoduje to ostatecznie duplikat ograniczenia klucza, gdy sekwencja tworzy identyfikator dla istniejącego wiersza.

+1

Po pewnych badaniach, w moim przypadku było to mapowanie Hibernacji, które generowało własne identyfikatory i ignorowało sekwencję. Nie jestem pewien, czy powinienem usunąć pytanie w tej sprawie - wygląda na to, że inni napotykają ten sam problem. – Jake

+2

Możesz po prostu odpowiedzieć na własne pytanie. Naprawdę nie ma mowy, aby sekwencje się "zsynchronizowały", chyba że (lub niektóre oprogramowanie pośrednie) nie używają sekwencji do generowania kluczy podstawowych dla niektórych lub wszystkich wierszy. – nos

Odpowiedz

8

Twoja aplikacja prawdopodobnie od czasu do czasu ustawia wartość klucza podstawowego dla nowego wiersza. Następnie postgresql nie ma potrzeby uzyskiwania nowej sekwencji, a kolejność nie jest aktualizowana.

+1

To jest poprawne - odwzorowanie hibernacji zignorowało sekwencję, więc gdy aplikacja inna niż hibernacja wstawiła wiersz, który pozwala sekwencji generować identyfikator, sekwencja była nieaktualna. – Jake

0

Po przydzieleniu numeru sekwencyjnego pozostaje on przydzielony, nawet jeśli TX, który zażądał, zostanie wycofany. Tak więc można przydzielić liczbę, która nie pojawia się w stabilnej bazie danych. Oczywiście wiersze można również usuwać po ich utworzeniu, więc maksymalna liczba w tabeli nie musi być maksymalną liczbą przydzieloną. Dotyczy to każdego rodzaju inkrementacji.

Ponadto, w zależności od zastosowanej technologii, można stosować oddzielne sekwencje z wieloma tabelami, więc w Tabeli A może brakować wartości, ale obecna w Tabeli B. Może to być spowodowane błędem w używaniu nazw sekwencji lub może być celowe.

+1

To nie jest odpowiedź na to pytanie. – Tometzky

Powiązane problemy