Вставить все вызывает нарушение уникального ограничения первичного ключа - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь использовать INSERT ALL для вставки строк в мою таблицу.

INSERT ALL
INTO TABLE(C2, C3) VALUES ("Hello","World")
...
...
SELECT 1 from DUAL;

Столбец C1 таблицы имеет ограничение первичного ключа, и его значение устанавливается как следующее значение по умолчанию для следующей последовательности, которую я создал (это было сделано при создании таблицы),

C1 NUMBER(10,0) DEFAULT SEQUENCE1.NEXTVAL NOT NULL,
.
.
CONSTRAINT Constraint1 PRIMARY KEY (C1)

При выполнении операции вставки всего состояния я получаю сообщение об ошибке

ORA-00001: уникальное ограничение (databaseName.Constraint1) нарушено

Это происходит потому, что insert all выполняет некоторую синхронизированную вставку, а последовательность не увеличивается? Я пытаюсь использовать Insert ALL только для новой вставки (не копируя из исходной таблицы в таблицу назначения) Я не хочу использовать запрос вставки для каждой строки. Это то, что я пытаюсь исследовать.

1 Ответ

1 голос
/ 22 мая 2019

Да, INSERT ALL генерирует только одно значение последовательности для всех вставленных строк, что вызывает нарушение ограничения. Замените INSERT ALL несколькими подзапросами SELECT ... FROM DUAL UNION ALL, и последовательности будут работать как положено.

Этот код будет вызывать NEXTVAL для каждой строки:

insert into table1(c2, c3)
select 'Hello', 'World' from dual union all
select 'Hello', 'World' from dual;

В качестве бонуса, трюк UNION ALL имеет тенденцию работать быстрее, чем INSERT ALL.

...