【问题标题】:ORA-32795: cannot insert into a generated always identity columnORA-32795: 无法插入生成的始终标识列
【发布时间】:2017-05-07 15:40:00
【问题描述】:

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

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

声明是:

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)

【问题讨论】:

    标签: sql oracle oracle12c identity-column


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      目标表 (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 如果指定 ALWAYS,则 Oracle 数据库始终使用 序列生成器为列分配值。如果您尝试 使用 INSERT 或 UPDATE 为列显式赋值,然后 将返回一个错误。这是默认设置。

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

      【讨论】:

      • 我相信这是正确的答案。在某些情况下,我们确实需要明确的 ID,以便了解 DEFAULT 和 ALWAYS 之间的区别
      • 是的,我也更喜欢大卫的回答。在调试时,有时了解解决方法会有所帮助。 :)
      【解决方案3】:

      示例:my_table_column NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY - 如果您将列定义为,那么它将在它为 NULL 时获取该值,并且如果您要插入/更新该列的值,则不会干扰。它对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-27
        • 2019-02-21
        • 1970-01-01
        相关资源
        最近更新 更多