Sql ORA-32795:无法插入到生成的始终标识列中
伙计们,我正在尝试执行下面的insert语句,但我不断收到错误: 无法插入到生成的始终标识列中 声明如下: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 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的答案。在调试时,了解变通解决方案有时会有所帮助。:)