我从以下查询中获得ORA-00947: not enough values
:
insert into tableb
(colA, colb, colc, cold)
select
(select max(rec_no)+1 from tableb)
F2,
F3,
F4
from tablea;
有人能指出我将inser的子查询包含在/ select语句中的正确方法吗?
由于
答案 0 :(得分:15)
你只是错过了一个逗号。事实上,Oracle认为F2
是您的子选择的名称。
insert into tableb
(colA, colb, colc, cold)
select
(select max(rec_no)+1 from tableb) , -- comma here
F2,
F3,
F4
from tablea;
答案 1 :(得分:7)
唯一可靠,快速且可扩展的生成唯一ID的方法是使用序列。
max()
“解决方案”不起作用的原因是,事务不会看到来自另一个事务的未提交的更改。因此,两个并发事务最终会使用max()
的相同值,这反过来会生成重复的id值。
要根据案例中的序列创建值,您显然需要先创建序列:
create sequence seq_b;
然后在select语句中使用该序列:
insert into tableb
(colA, colb, colc, cold)
select seq_b.nextval,
F2,
F3,
F4
from tablea;