[Oracle] Sequence insert select ORA-00001

sinet

select MESSAGE_TRANSFER_SEQ.CURRVAL from dual;
91824935
select count(*) from table where id>=91824935;
0
insert into table (id)
select MESSAGE_TRANSFER_SEQ.NEXTVAL
from oldschema.table where rownum<21;
ORA-00001: unique constraint (schema.pk_table) violated
Причем при where rownum<20 всё работает.
Может кто-нибудь уже наступал на эти грабли?
PS Oracle 10.2.0.2

aleks058

Очень похоже на параметр сиквенса (по умолчанию = 20 который говорит, сколько значений надо зарезервировать при первом вызове NEXTVAL (насколько понимаю, Ораклу это надо для оптимизации по скорости).
Но как это может играть в твоем случае, я не понимаю.
Чего ты хотел своим кодом добиться?

sinet

Этот параметр cache. Пробовал увеличить его - не помогает.
Хочу слить две таблицы в одну. Проблема в том что id`шники пересекаются.
Попробую сначала пересечение id`шников устранить...

Dasar

Причем при where rownum<20 всё работает
дык, в первых 20-ти записях у тебя дублей нет, а 21-ая строка является дублем одной из предыдущих

sinet

Вообще я из сиквенса строчки делаю, они все различны, по крайней мере должны быть. Иначе весь смысл сиквенса теряется.

aleks058

У тебя в таблице уже есть запись с Id = 21 - поэтому и получаешь ОРУ.

sinet

Нет там таких записей:
select MESSAGE_TRANSFER_SEQ.CURRVAL from dual;
91824935
select count(*) from table where id>=91824935;
0

sinet

В общем сделал:
update oldschema.table set id=MESSAGE_TRANSFER_SEQ.NEXTVAL;
insert into table select * from oldschema.table;
Но вопрос всё равно открыт.

pitrik2

insert into table (id)
select MESSAGE_TRANSFER_SEQ.NEXTVAL
from oldschema.table where rownum<21;
ORA-00001: unique constraint (schema.pk_table) violated
странно как-то все
похоже что 21-я строчка в старой таблице совпадает с одной из 1-20 строчкой, скажем с 15-й
оракл видит что 15 и 21 строчка одинаковые и не вычисляет выражение по новой а использует старое
попытаюсь поподробнее объяснить:
oldschema.table содержит такие данные:
'foo'
'bar'
'foo'
сиквенс начинается с 1
запрос
select MESSAGE_TRANSFER_SEQ.NEXTVAL
from oldschema.table where rownum<21;
вернет
1
2
1
т.е. в третьем случае выражение не посчиталось а взялось предыдущее, т.е. NEXTVAL не сработал
P.S.
это мои догадки
может я и бред написал

sinet

На oldschema.table тоже есть первичный ключ -> все записи различны. Да и в теории не должно это влиять...
Похоже надо патчиться.

mbolik1

А что выдаёт вот этот запрос?
select MESSAGE_TRANSFER_SEQ.NEXTVAL 
from oldschema.table where rownum<21;

Да и параметры последовательности неплохо бы знать. Вдруг она у тебя циклическая.

ava3443

На oldschema.table тоже есть первичный ключ -> все записи различны. Да и в теории не должно это влиять...
Похоже надо патчиться.
прежде чем патчить, хорошо бы знать, от чего
если прям так уверен, что всё делаешь правильно, то открывай TAR, это самый правильный путь
Оставить комментарий
Имя или ник:
Комментарий: