如果目标表具有generate always as标识列,oracle是否允许对值使用select语句进行sql插入

j1dl9f46  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(381)

我正在尝试将行插入到一个oracle19c表中,我们最近添加了一个generated always as identity列(列名为“id”)。列应该自动递增,不需要在insert语句中显式指定。典型的insert语句工作-即insert到表中的名称(field1,field2)值('f1','f2')(只是一个例子)。执行典型插入时,id字段将递增。但是下面的查询在添加identity列之前是有效的,现在不起作用并返回错误:ora-00947:没有足够的值。
除了不包括新的id identity字段之外,字段计数是相同的,我希望它会自动递增。此语句不允许与标识列一起使用吗?
insert into语句使用select from另一个表,是否不允许这样做并产生错误?

INSERT INTO T.AUDIT
(SELECT r.IDENTIFIER, r.SERIAL, r.NODE, r.NODEALIAS, r.MANAGER, r.AGENT, r.ALERTGROUP,
r.ALERTKEY, r.SEVERITY, r.SUMMARY, r.LASTMODIFIED, r.FIRSTOCCURRENCE, r.LASTOCCURRENCE,
r.POLL, r.TYPE, r.TALLY, r.CLASS, r.LOCATION, r.OWNERUID, r.OWNERGID, r.ACKNOWLEDGED,
r.EVENTID, r.DELETEDAT, r.ORIGINALSEVERITY, r.CATEGORY, r.SITEID, r.SITENAME, r.DURATION,
r.ACTIVECLEARCHANGE, r.NETWORK, r.EXTENDEDATTR, r.SERVERNAME, r.SERVERSERIAL, r.PROBESUBSECONDID
FROM R.STATUS r
JOIN
(SELECT SERVERSERIAL, MAX(LASTOCCURRENCE) as maxlast
FROM T.AUDIT
GROUP BY SERVERSERIAL) gla
ON r.SERVERSERIAL = gla.SERVERSERIAL
WHERE (r.LASTOCCURRENCE > SYSDATE - (1/1440)*5 AND gla.maxlast < r.LASTOCCURRENCE)
) )

谢谢你的帮助。

yfwxisqw

yfwxisqw1#

是的,是的;插入您的示例

INSERT INTO table_name (field1,field2) VALUES ('f1', 'f2')

也可以作为

INSERT INTO table_name (field1,field2) SELECT 'f1', 'f2' FROM DUAL

db<>小提琴演示
有问题的real insert语句没有指定目标列列表,因此在使用时依赖于表中与查询结果匹配的列(及其数据类型)(这与依赖 select * ,并且由于某些相同的原因可能会出现问题。)
查询选择34个值,因此表有34列。现在,您已经向表中添加了第35列,即新的id列。您知道您不想直接插入到该列中,但一般来说,oracle不想,至少在比较查询和表列时是这样。该表有35列,因此您在语句中没有另外说明,它在select列表中需要35个值。
oracle无法知道您跳过了35列中的哪一列。可以说,它可以根据身份栏猜测,但这将是更多的工作和不一致的,它坚持你做的工作,以确保它是正确的,这不是没有道理的。它期望35个值,它看到34个值,所以它抛出一个错误,说没有足够的值-这是真的。
你的问题意味着你认为甲骨文可能在做一些特别的事情来阻止 insert ... select ... 语法如果有一个标识列,但事实上它是相反的-它没有做任何特殊的事情,它报告列/值计数不匹配,因为它通常会。
因此,必须列出要填充的列—不能自动跳过一列。所以你需要:

INSERT INTO T.AUDIT (IDENTIFIER, SERIAL, NODE, ...,  PROBESUBSECONDID)
SELECT r.IDENTIFIER, r.SERIAL, r.NODE, ...,  r.PROBESUBSECONDID
FROM ...

如果实际列名与查询列名不同,则使用实际列名。
如果不能更改insert语句,那么可以使id列不可见;但是您必须在查询中显式地指定它,如下所示: select * 我看不到,但你不应该依赖 * 不管怎样。
db<>小提琴

相关问题