ORA-32795:无法插入生成的始终标识列

时间:2016-12-22 04:42:13

标签: sql oracle oracle12c identity-column

伙计我正在尝试执行下面的insert语句并且我一直收到错误:

  

无法插入生成的始终标识列

声明是:

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 个答案:

答案 0 :(得分:5)

你不了解这个错误?你有一个"身份"列,其中值作为序列生成。你不能插入它。因此,列出所有其他列:

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中的所有列。这可以防止意外错误,因为列的顺序错误或表的列数不同。

答案 1 :(得分:3)

目标表中的一列(leaves_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,那么Oracle数据库总是使用   序列生成器为列分配值。如果你试图   然后使用INSERT或UPDATE显式地为列赋值   将返回错误。这是默认值。

     

BY DEFAULT如果指定BY DEFAULT,那么Oracle数据库使用   序列生成器默认为列赋值,但是你   也可以显式地为列指定一个指定的值。如果你   指定ON NULL,然后Oracle数据库使用序列生成器   在后续INSERT语句中为列分配值   尝试分配一个计算结果为NULL的值。

答案 2 :(得分:0)

示例:my_table_column缺省由NULL作为标识生成的数字-如果您将列定义为as,则它将在为NULL时获得该值,并且在插入/更新该列的值时也不会受到干扰。它对我有用。