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

gha*_*lib 8 sql oracle identity-column oracle12c

伙计们我试图在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)
Run Code Online (Sandbox Code Playgroud)

Dav*_*itz 8

目标表 (leaves_approval) 中的一列包含定义为Generated always的标识列。
标识列可以在 2 种模式下创建 -始终生成无法分配和默认生成可以分配。


如果您愿意,可以更改列模式,然后“按原样”插入。
考虑到这可能会在标识列中创建重复项或由于约束而失败。

ALTER TABLE leaves_approval MODIFY **my_identity_column** GENERATED BY DEFAULT AS IDENTITY;
Run Code Online (Sandbox Code Playgroud)

或者您可以从 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)
Run Code Online (Sandbox Code Playgroud)

数据库 SQL 语言参考 - CREATE TABLE

ALWAYS 如果指定 ALWAYS,则 Oracle 数据库始终使用序列生成器为列分配值。如果您尝试使用 INSERT 或 UPDATE 为列显式分配值,则将返回错误。这是默认设置。

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

  • 我相信这是正确的答案。在某些情况下,我们确实需要显式 ID,以便了解 DEFAULT 和 ALWAYS 之间的区别 (2认同)

Gor*_*off 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);
Run Code Online (Sandbox Code Playgroud)

通常,最好以任何方式列出所有列INSERT。这样可以防止意外错误,因为列顺序错误或表中的列数不同。