2016-12-22 1 views
5

Guys Я пытаюсь выполнить ниже вставку заявления и я получаю сообщение об ошибке:ORA-32795: не удается вставить в сгенерированный всегда столбец идентификации

cannot insert into a generated always identity column

утверждение является:

INSERT INTO leaves_approval 
SELECT * 
FROM requests_temp r 
WHERE r.civil_number = 33322 
     AND r.request_id = (SELECT Max(s.request_id) 
          FROM requests_temp s) 

ответ

3

Что разве вы не понимаете об ошибке? У вас есть столбец «identity», где значение генерируется как последовательность. Вы не можете вставить в него. Итак, список всех остальных столбцов:

INSERT INTO LEAVES_APPROVAL(col1, col2, col3, . . .) 
    SELECT col1, col2, col3, . . . 
    FROM REQUESTS_TEMP r 
    WHERE r.CIVIL_NUMBER = 33322 AND 
      r.REQUEST_ID = (SELECT MAX(s.REQUEST_ID) FROM REQUESTS_TEMP s); 

В общем, это хорошая идея, чтобы перечислить все столбцы в качестве INSERT все равно. Это предотвращает непредвиденные ошибки, поскольку столбцы находятся в неправильном порядке или таблицы имеют различное количество столбцов.

0

Один из столбцов целевой таблицы (leaf_approval) содержит столбец идентификации, который был определен как Сгенерировано всегда.
Идентичность столбцы могут быть созданы в 2-х режимах - Сформирован всегда, что не может быть назначена и Сформирован по умолчанию что может быть назначен.

Если вы хотите, вы можете изменить режим столбца, а затем внести свою вставку «как есть».
Учитывайте, что это может создать дубликаты в столбце идентификации или не удалось из-за ограничений.

ALTER TABLE leaves_approval MODIFY **my_identity_column** GENERATED BY DEFAULT AS IDENTITY; 

Или вы можете исключить столбец идентификаторов из списка INSERT (но вы должны указать полный список столбцов, за исключением столбца идентификации), например, -

INSERT INTO leaves_approval (c1,c2,c3,c4,...) 
SELECT c1,c2,c3,c4 ... 
FROM requests_temp r 
WHERE r.civil_number = 33322 
     AND r.request_id = (SELECT Max(s.request_id) 
          FROM requests_temp s) 

Database SQL Language Reference - CREATE TABLE

ALWAYS If you specify ALWAYS, then Oracle Database always uses the sequence generator to assign a value to the column. If you attempt to explicitly assign a value to the column using INSERT or UPDATE, then an error will be returned. This is the default.

BY DEFAULT If you specify BY DEFAULT, then Oracle Database uses the sequence generator to assign a value to the column by default, but you can also explicitly assign a specified value to the column. If you specify ON NULL, then Oracle Database uses the sequence generator to assign a value to the column when a subsequent INSERT statement attempts to assign a value that evaluates to NULL.

Смежные вопросы