我从下面的查询得到ORA-00947: not enough values
:甲骨文 - SQL - 插入与子选择
insert into tableb
(colA, colb, colc, cold)
select
(select max(rec_no)+1 from tableb)
F2,
F3,
F4
from tablea;
可有人点我到正确的方式包括一个inser成/ select语句的子查询?
谢谢
我从下面的查询得到ORA-00947: not enough values
:甲骨文 - SQL - 插入与子选择
insert into tableb
(colA, colb, colc, cold)
select
(select max(rec_no)+1 from tableb)
F2,
F3,
F4
from tablea;
可有人点我到正确的方式包括一个inser成/ select语句的子查询?
谢谢
您只是缺少一个逗号。实际上,Oracle认为F2
是您的子选择的名称。
insert into tableb
(colA, colb, colc, cold)
select
(select max(rec_no)+1 from tableb) , -- comma here
F2,
F3,
F4
from tablea;
谢谢!我疯了! –
如果表中没有行开始,或者多个会话同时运行该代码,则不起作用。不幸的是,这种方法存在根本上的缺陷。 –
@David Aldridge表格不是空的,我是唯一运行此代码的人。有更好的方法吗? –
生成唯一ID的唯一可靠,快速和可扩展的方法是使用序列。
max()
“解决方案”将无法正常工作的原因是,事务不会看到来自其他事务的未提交更改。因此两个并发事务可以使用相同的值作为max()
,这反过来会产生重复的id值。
从你的情况序列创造价值,你显然需要首先创建一个序列:
create sequence seq_b;
然后使用该序列中的SELECT语句:
感谢您的解释和帮助。 –
我希望你是不要试图用'max()'approache来创建一个唯一的ID。因为它根本无法工作。更好地使用序列 –
@a_horse_with_no_name实际上这是我正在尝试的。你能提供一个关于我如何通过一个序列来实现的讨论链接吗?谢谢 –
看到我的答案。该序列仍然不能解决问题如果tablea为空(如David Aldridge所述),该怎么办 –