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

新手上路,请多包涵

伙计们,我正在尝试执行下面的插入语句,但我不断收到错误消息:

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

声明是:

 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)

原文由 ghalib 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

您对错误有什么不明白的地方?您有一个“身份”列,其中值作为序列生成。您不能插入其中。因此,列出所有其他列:

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

原文由 Gordon Linoff 发布,翻译遵循 CC BY-SA 3.0 许可协议

目标表 (leaves_approval) 中的列之一包含定义为 Generated always 的标识列。

标识列可以在 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)


数据库 SQL 语言参考 - CREATE TABLE

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

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

原文由 David דודו Markovitz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进