Установить значение генератора.

__Avenger__
Дата: 29.06.2012 08:46:12
Можно ли установить значение генератора значением из запроса, например так:
ALTER SEQUENCE GEN_CLIENT_ID RESTART WITH (select max(client_id) from clients)

?
arni
Дата: 29.06.2012 10:14:55
__Avenger__,

если уж набрал, то чего не проверил?
формально, ALTER SEQUENCE - это DML, и на подзапрос может послать.
а вот gen_id() - это просто функция, и тут должна прокатить, как мне кажется:
GEN_ID(GEN_CLIENT_ID, (select max(client_id) from clients) - GEN_ID(GEN_CLIENT_ID, 0));
AltHasp
Дата: 29.06.2012 14:42:25
А умные из сего форума говорили что не надо юзать функцию Gen_ID с параметром нуль (Gen_ID,0),
хотя бы до использования его в данном подключении. Или я что-ть спутал ? Верняк брать максим. знач. полей ИМНО !
arni
Дата: 29.06.2012 14:45:59
AltHasp,

таки автор не пытается узнать последнее сгенерированое ID, что бы сослаться в каком-нибудь FK,
а отматывает счетчик куда ему надо. Т.е. речь не о рутинной операции, а об разовой.
Таблоид
Дата: 29.06.2012 14:59:45
AltHasp
А умные из сего форума говорили что не надо юзать функцию Gen_ID с параметром нуль (Gen_ID,0), хотя бы до использования его в данном подключении.
Это в оракле так следует делать: сначала дёрнуть seqname.nextval, а затем уже обращаться к .currval (к тому же, этот .currval для ЭТОЙ сессии так и останется неизменным, даже если в других коннектах дёргать seqname дальше).
Про ФБ - никогда не натыкался на подобное поведение. Кто и где такое говорил ?
Симонов Денис
Дата: 29.06.2012 15:18:38
Если в это время больше никто не работает с БД, то должно быть всё нормально. Иначе этого не следует делать.
arni
Дата: 29.06.2012 17:13:40
Симонов Денис
никто не работает с БД, то должно быть всё нормально.
Очень скользкое утверждение.
Предположим, что ты вставил мастер-запись и через gen_id(..., 0) узнал вставленный через триггер ID, чтобы плодить далее detail-записи в подчиненной таблице.
Сказка обрушится к примеру, если каскадно сработают триггеры, которые вставили еще чего-нибудь куда-нибудь (например, логи, репликация и т.д.), отматывая тот же самый генератор.

Общее правило тут должно быть:
Сначала сгенерировал ID, затем его используй. Никаких gen(..., 0) чтобы узнать последний ID - это всегда вероятностный подход и даже в монопольном подключении, если только система не совершенно примитивная.
__Avenger__
Дата: 29.06.2012 19:56:52
arni
__Avenger__,

если уж набрал, то чего не проверил?
формально, ALTER SEQUENCE - это DML, и на подзапрос может послать.
а вот gen_id() - это просто функция, и тут должна прокатить, как мне кажется:
GEN_ID(GEN_CLIENT_ID, (select max(client_id) from clients) - GEN_ID(GEN_CLIENT_ID, 0));


Спасибо.
maseesma
Дата: 08.08.2012 11:57:31
автор
GEN_ID(GEN_CLIENT_ID, (select max(client_id) from clients) - GEN_ID(GEN_CLIENT_ID, 0));

у меня чего то ругается на GEN_ID
WildSery
Дата: 08.08.2012 12:09:29
maseesma,

Это потому, что Language Reference не читан. Как именно пользоваться.