Jedynym niezawodnym, szybkim i skalowalnym sposobem generowania unikalnych identyfikatorów jest używanie sekwencji.
Powód, dla którego "rozwiązanie" max()
nie zadziała, to transakcja nie zobaczy niezatwierdzonych zmian z innej transakcji. Zatem dwie równoczesne transakcje mogą zakończyć się przy użyciu tej samej wartości dla max()
, która z kolei wygeneruje zduplikowane wartości id.
Aby utworzyć wartości z sekwencji w Twoim przypadku, to oczywiście trzeba najpierw utworzyć sekwencję:
create sequence seq_b;
następnie wykorzystać tę sekwencję w select:
insert into tableb
(colA, colb, colc, cold)
select seq_b.nextval,
F2,
F3,
F4
from tablea;
Mam nadzieję, że jesteś nie próbujemy stworzyć unikalnego identyfikatora za pomocą tej metody 'max()'. Ponieważ po prostu nie będzie działać. Lepiej użyj sekwencji –
@a_horse_with_no_name, faktycznie to właśnie próbowałem. Czy możesz podać link do dyskusji na temat tego, jak to osiągnąć za pomocą sekwencji? Dzięki –
Zobacz moją odpowiedź. Sekwencja nadal nie rozwiąże problemu, co zrobić, jeśli tablea jest pusta (jak wspomniał David Aldridge). –