2012-12-12 92 views
6

我从下面的查询得到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语句的子查询?

谢谢

+5

我希望你是不要试图用'max()'approache来创建一个唯一的ID。因为它根本无法工作。更好地使用序列 –

+0

@a_horse_with_no_name实际上这是我正在尝试的。你能提供一个关于我如何通过一个序列来实现的讨论链接吗?谢谢 –

+1

看到我的答案。该序列仍然不能解决问题如果tablea为空(如David Aldridge所述),该怎么办 –

回答

13

您只是缺少一个逗号。实际上,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

谢谢!我疯了! –

+1

如果表中没有行开始,或者多个会话同时运行该代码,则不起作用。不幸的是,这种方法存在根本上的缺陷。 –

+0

@David Aldridge表格不是空的,我是唯一运行此代码的人。有更好的方法吗? –

6

生成唯一ID的唯一可靠,快速和可扩展的方法是使用序列。

max()“解决方案”将无法正常工作的原因是,事务不会看到来自其他事务的未提交更改。因此两个并发事务可以使用相同的值作为max(),这反过来会产生重复的id值。

从你的情况序列创造价值,你显然需要首先创建一个序列:

create sequence seq_b; 

然后使用该序列中的SELECT语句:

​​
+0

感谢您的解释和帮助。 –