2016-05-21 9 views
0

私たちはOracle Databaseを持っており、多くのデータを格納する表があります。 この表にはプライマリ・キーがあります。通常、これらのプライマリ・キーは挿入時に作成されます新しい行のORA-00001:一意キー:手動でプライマリ・キーを設定する

しかし、ここでは、特定の固定プライマリキーを使用してこのテーブルにデータを手動で挿入する必要があります。これらの主キーを変更する方法はありません。例えばので

は、私たちのテーブルには、すでに20 に主キー1と20個のエントリは、今では21〜23

主キーを使用して手動でデータを追加する必要がありました誰かが標準的な方法で行を入力したい場合、挿入プロセスは次の理由で失敗します。

Caused by: java.sql.BatchUpdateException: ORA-00001: Unique Constraint (VDMA.SYS_C0013552) verletzt 

    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10500) 
    at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:230) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 

私は完全に理解しています次の主キーがすでに作成されているため、次の主キーを作成しているデータベースルーチン(シーケンス)が失敗します。

しかし、次のプライマリキーが21ではなく24であることを認識するために、シーケンスを再び表に表示する方法を教えてください。

UPDATE

IDが含まれているリンクを使ってWeb Interfaceを使用してレコードにアクセスしているため、IDが同じに滞在する必要がある理由です。 したがって、古いIDを新しいIDにマッピングする実装を変更するか、IDをデータベースに保存します。

アップデート2

解決策を見つけた:私たちは休止状態を使用しているので、1つの配列のみがすべてのテーブルに移入されます。したがって、私が答えを探していた4日間の主キーは非常に高くなり、すべてのデータを簡単にインポートできます。

+2

"*これでプライマリキー21〜23 *で手動でデータを追加する必要があります。シーケンスを使用してこれらの値を挿入します。他のすべてが困ってしまうでしょう。シーケンスをテーブルで「見る」ようにする方法はありません。シーケンス値を変更する唯一の方法は、 'nextval'を呼び出すか、新しい開始値でシーケンスを削除して再作成することです。 –

+0

シーケンスヘルプを再作成しますか? – Breiti

+2

手作業で挿入した最大値に基づいて、次の利用可能なIDにシーケンスを一度進めます。 –

答えて

1

シーケンスをもう一度見て、次の主キーが21ではなく24であることを確認するにはどうすればよいですか?

Oracleでは、シーケンスでは、特定の表に使用する予定がないことがわかります。すべてのシーケンスが知っているのは、現在の値、インクリメント、maxvalなどです。したがって、テーブルを調べるようにシーケンスを指示することはできませんが、ストアドプロシージャにテーブルをチェックして、プライマリキーの最大値を超えてシーケンスをインクリメントするように指示できます。言い換えれば、プライマリキーを非シーケンス値で手動で更新することを本当に主張する場合、コードではPK内の非シーケンス値をチェックし、シーケンスを使用して新しいPKを生成する前にシーケンスを高速化する必要があります。ここで

は、あなたがそれをする必要がある場合にシーケンスを起動するために使用できる単純なものである:

select testseq.nextval from dual; 

あなたは1で、それシーケンスの増分を実行するたびにループの中でそれをスティックし、それを実行しますtestseq.currvalまでは必要な場所です。

私は@a_horse_with_no_nameと@EdStevensに同意しました。手動で行を挿入する必要がある場合は、少なくとも '21'のようなリテラルの代わりにinsert内のsequence_name.nextvalを使用してください。このように:

create table testtab (testpk number primary key, testval number); 

create sequence testseq start with 1 increment by 1; 

insert into testtab values (testseq.nextval, '12'); 
insert into testtab values (testseq.nextval, '123'); 
insert into testtab values (testseq.nextval, '1234'); 
insert into testtab values (testseq.nextval, '12345'); 
insert into testtab values (testseq.nextval, '123456'); 

select * from testtab; 

testpk testval 
2 12 
3 123 
4 1234 
5 12345 
6 123456 
+0

ありがとうございます。クライアントが保存されたURLを使用してアクセスしているのと同じです( – Breiti

+0

こんにちは@Breiti、すでに割り当てられているIDは同じままにしておきますが、次回に手動でIDを生成する必要があります。 insertvalueに数字を書き込むのではなく、 'nextval 'を挿入する必要があります。' select testseq.nextval from dual; 'を実行して、必要な位置にシーケンスを持っていくのに十分な時間があれば、既に割り当てられているIDのどちらかです。 –

関連する問題