伙计我正在尝试执行下面的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)
答案 0 :(得分: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);
一般来说,最好列出INSERT
中的所有列。这可以防止意外错误,因为列的顺序错误或表的列数不同。
答案 1 :(得分:3)
目标表中的一列(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,那么Oracle数据库总是使用 序列生成器为列分配值。如果你试图 然后使用INSERT或UPDATE显式地为列赋值 将返回错误。这是默认值。
BY DEFAULT如果指定BY DEFAULT,那么Oracle数据库使用 序列生成器默认为列赋值,但是你 也可以显式地为列指定一个指定的值。如果你 指定ON NULL,然后Oracle数据库使用序列生成器 在后续INSERT语句中为列分配值 尝试分配一个计算结果为NULL的值。
答案 2 :(得分:0)
示例:my_table_column缺省由NULL作为标识生成的数字-如果您将列定义为as,则它将在为NULL时获得该值,并且在插入/更新该列的值时也不会受到干扰。它对我有用。