[Oracle] Inkrementacja a usuwanie

0

Mam tabelę z kolumną typu int. Stworzyłem też sekwencję, dzięki której mogę przy wstawianiu nowych wierszy inkrementować wartość, tzn:

insert into tab (id) values (seq_tab.nextvalue);

Powiedzmy że mam następuący stan tabeli:
1
2
3
4
5

Teraz usuwam wiersze o id 4 i 5.
Następnie dodaję kolejny wiersz:

insert into tab (id) values (seq_tab.nextvalue);

Stan tabeli po dodaniu:
1
2
3
6

A chciałbym żeby było:
1
2
3
4

Pytanie: jak to zrobić?

0

http://4programmers.net/Forum/609868
konkluzja tamtego tematu: nie robic tak bo nie ma sensu

0

A co jeżeli zakres się wyczerpie? Da się wtedy wstawiać kolejne wiersze w te luki?

0

Wyczerpie? Zwykły int to jest 4294967294 możliwych wartości, nawet jeśli miałbyś tylko połowę z tego zajętą to by było 8589934588 bajtów (licząc 4 bajty na takiego inta) czyli prawie 8GB na same klucze
Wracając do pytania: głowy nie dam, ale prawie na pewno się da. Kwestia jakiego systemu bazodanowego używasz.

0

Może przepełnienie zakresu jest mało realistyczne, ale trzeba zabezpieczyć się na każdą możliwość. Używam Oracle.

0

Oracle 8 pozwala mi ustawić max_val w sekwencji na 28 cyfrową liczbę-wątpię, żebyś dał radę tto wyczerpać

jeżeli to ma służyć do nadawania id to jest bez sensu.

A co jeżeli masz w tabeli 1 2 3 4 i usuniesz 1 i 3? jaki wtedy kolejny element dodasz? 1,3 czy może 5?

Żeby nadawać pierwszy wolny musiałbyś trzymać gdzieś tabelę wolnych elementów(jeżeli akceptujesz, że przez pewien czas tabela może mieć "dziury", albo przenumerowywać wszystkie rekordy w tabeli przy każdym wstawieniu (co jak pisano wcześniej będzie powodować miliony operacji zapisu)

Na wyczerpanie się możesz zastosować np dwa indeksy:
id1, id2 i jak id1 się wyczerpie to zwiększasz o 1 id2 ;) wtedy masz: 10e28 x10e28 możliwych indexów

1 użytkowników online, w tym zalogowanych: 0, gości: 1