私は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 into / selectステートメントのサブクエリを含める正しい方法を誰かに教えてもらえますか?
ありがとう
カンマが足りません。F2
現状では、Oracleはサブセレクトの名前であると考えています。
insert into tableb
(colA, colb, colc, cold)
select
(select max(rec_no)+1 from tableb) , -- comma here
F2,
F3,
F4
from tablea;
一意のIDを生成するための信頼性が高く、高速でスケーラブルな唯一の方法は、シーケンスを使用することです。
「ソリューション」が機能しない理由max()
は、トランザクションが別のトランザクションからのコミットされていない変更を認識しないためです。したがって、2つの同時トランザクションが同じ値を使用して終了する可能性があり、その値に対してmax()
重複するID値が生成されます。
ケースのシーケンスから値を作成するには、明らかに最初にシーケンスを作成する必要があります。
create sequence seq_b;
次に、selectステートメントでそのシーケンスを使用します。
insert into tableb
(colA, colb, colc, cold)
select seq_b.nextval,
F2,
F3,
F4
from tablea;