![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение текущего значения генератора [D7, fb2]
Евгений Р. © (2008-08-28 23:25:00)После перекачивания данных со старой программы в новую хочу установить значение генератора:
ALTER SEQUENCE GEN_N RESTART WITH
(select max(field1)+1
from table1)
похоже, что эта команда работает только с константой?
turbouser (2008-08-31 19:41:00) [1]Кстати, все правильно насчет
> что эта команда работает только с константой
т.к. DDL с DML низзя мешать в одну кучу :)
Loginov Dmitry (2008-08-31 12:05:00) [2]> select gen_id(GEN_N,(select max(field1)+1 from table1))
> from rdb$database
тогда уж так:
SELECT gen_id(GEN_TEST, -gen_id(GEN_TEST, 0) + (SELECT Max(ID) FROM TEST) + 1) FROM RDB$DATABASE
turbouser (2008-08-29 16:39:00) [3]
> Евгений Р. (29.08.08 16:31) [10]
FB ведь OpenSource.
Вот тут, например
http://fisheye1.atlassian.com/browse/~raw,r=1.293/firebird/firebird2/src/dsql/parse.y
Евгений Р. (2008-08-29 16:31:00) [4]
> turbouser © (29.08.08 16:15) [9]
а как Вы это получили?
turbouser (2008-08-29 16:15:00) [5]в parse.y вот что:
alter_sequence_clause : symbol_generator_name RESTART WITH signed_long_integer
{ $$ = make_node (nod_set_generator2, e_gen_id_count, $1,
MAKE_const_slong ((IPTR) $4)); }
| symbol_generator_name RESTART WITH NUMBER64BIT
{ $$ = make_node (nod_set_generator2, e_gen_id_count, $1,
MAKE_constant((dsql_str*) $4, CONSTANT_SINT64)); }
| symbol_generator_name RESTART WITH '-' NUMBER64BIT
{ $$ = make_node (nod_set_generator2, e_gen_id_count, $1,
make_node(nod_negate, 1, MAKE_constant((dsql_str*) $5, CONSTANT_SINT64))); }
Если я правильно понял - то только константа.
Евгений Р. (2008-08-29 15:54:00) [6]А всеже ALTER SEQUENCE GEN_N RESTART WITH nn работает только с константой?
turbouser (2008-08-29 15:38:00) [7]
> Евгений Р. (29.08.08 15:33) [6]
А, точно, там же инкремент...
Евгений Р. (2008-08-29 15:33:00) [8]проверка:
1.создаю gen_n
2.присваиваю значение 1000
3.select gen_id(GEN_N,200) from rdb$database
4.значение стало 1200. а мне надо установить 200
за направление спасибо
искомый результат получил:
select gen_id(GEN_N,
(select max(field) from table)-
(select gen_id(GEN_N,0)from rdb$database)) from rdb$database
turbouser (2008-08-29 14:59:00) [9]Присвоение значения генератору происходит вне контекста транзакции
turbouser (2008-08-29 14:57:00) [10]
> Евгений Р. (29.08.08 14:45) [3]
Зачем в 2 запроса ? при выполнении запроса из [2] GEN_N будет иметь значение max(field1)+1
Какой смысл обнулять?
Евгений Р. (2008-08-29 14:45:00) [11]т.е. в 2 запроса:
1- обнулить его
2- [2] инкременировать на нужную величину?
turbouser (2008-08-29 06:11:00) [12]Может так устроит?
select gen_id(GEN_N,(select max(field1)+1 from table1)) from rdb$database
Евгений Р. (2008-08-28 23:30:00) [13]аналогично SET GENERATOR