2012-12-12 113 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

感謝您的解釋和幫助。 –