我從下面的查詢得到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所述),該怎麼辦 –