Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ORA-32795:无法插入到生成的始终标识列中_Sql_Oracle_Oracle12c_Identity Column - Fatal编程技术网

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

Sql ORA-32795:无法插入到生成的始终标识列中,sql,oracle,oracle12c,identity-column,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

伙计们,我正在尝试执行下面的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)

关于这个错误,你还不了解什么?您有一个“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
中的所有列。这可以防止出现意外错误,因为列的顺序错误或表的列数不同。

目标表中的一列(leaves\u approval)包含定义为始终生成的标识列。
标识列可以在两种模式下创建—始终生成,不能分配默认生成,可以分配


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

ALTER TABLE leaves_approval MODIFY **my_identity_column** GENERATED BY DEFAULT AS IDENTITY;
或者,您可以从插入列表中排除标识列(但您必须指明完整的列列表,标识列除外),例如-

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)

始终如果指定“始终”,则Oracle数据库始终使用 序列生成器为列指定值。如果你试图 使用INSERT或UPDATE为列显式赋值,然后 将返回一个错误。这是默认设置

默认情况下,如果默认指定,则Oracle数据库使用 sequence generator在默认情况下为列指定值,但是 也可以显式为列指定指定值。如果你 指定为空,则Oracle数据库使用序列生成器 在执行后续INSERT语句时为列指定一个值 尝试分配一个计算结果为NULL的值


示例:默认情况下,my_table_列编号以NULL作为标识生成-如果将列定义为,则当该列为NULL时,它将获取该值,并且不会干扰您是否插入/更新该列的值。这对我很有效。

我相信这是正确的答案。在某些情况下,我们确实希望显式ID很好地了解默认和ALWAYSYap之间的区别,我也更喜欢David的答案。在调试时,了解变通解决方案有时会有所帮助。:)