[Oracle] Sequence insert select ORA-00001
Очень похоже на параметр сиквенса (по умолчанию = 20 который говорит, сколько значений надо зарезервировать при первом вызове NEXTVAL (насколько понимаю, Ораклу это надо для оптимизации по скорости).
Но как это может играть в твоем случае, я не понимаю.
Чего ты хотел своим кодом добиться?
Но как это может играть в твоем случае, я не понимаю.
Чего ты хотел своим кодом добиться?
Этот параметр cache. Пробовал увеличить его - не помогает.
Хочу слить две таблицы в одну. Проблема в том что id`шники пересекаются.
Попробую сначала пересечение id`шников устранить...
Хочу слить две таблицы в одну. Проблема в том что id`шники пересекаются.
Попробую сначала пересечение id`шников устранить...
Причем при where rownum<20 всё работаетдык, в первых 20-ти записях у тебя дублей нет, а 21-ая строка является дублем одной из предыдущих
Вообще я из сиквенса строчки делаю, они все различны, по крайней мере должны быть. Иначе весь смысл сиквенса теряется.
У тебя в таблице уже есть запись с Id = 21 - поэтому и получаешь ОРУ.
Нет там таких записей:
select MESSAGE_TRANSFER_SEQ.CURRVAL from dual;
91824935
select count(*) from table where id>=91824935;
0
В общем сделал:
update oldschema.table set id=MESSAGE_TRANSFER_SEQ.NEXTVAL;
insert into table select * from oldschema.table;
Но вопрос всё равно открыт.
update oldschema.table set id=MESSAGE_TRANSFER_SEQ.NEXTVAL;
insert into table select * from oldschema.table;
Но вопрос всё равно открыт.
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.
это мои догадки
может я и бред написал
На oldschema.table тоже есть первичный ключ -> все записи различны. Да и в теории не должно это влиять...
Похоже надо патчиться.
Похоже надо патчиться.
А что выдаёт вот этот запрос?
Да и параметры последовательности неплохо бы знать. Вдруг она у тебя циклическая.
select MESSAGE_TRANSFER_SEQ.NEXTVAL
from oldschema.table where rownum<21;
Да и параметры последовательности неплохо бы знать. Вдруг она у тебя циклическая.
На oldschema.table тоже есть первичный ключ -> все записи различны. Да и в теории не должно это влиять...прежде чем патчить, хорошо бы знать, от чего
Похоже надо патчиться.
если прям так уверен, что всё делаешь правильно, то открывай TAR, это самый правильный путь
Оставить комментарий
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