2017-06-12 14 views
0

Oracle SQLを使用しています。新しいレコードがテーブルに追加されるたびに1からインクリメントするIDに使用されるシーケンスとトリガがあります。ただし、すべてのレコードが削除され、新しいレコードがこのテーブルに追加される場合、IDはシーケンスから記録された最後の最大レコード数から開始されますが、1から開始されません。テーブルが空の場合にシーケンスをリセットするには?

したがって、テーブルが空で新しいレコードがインポートされた場合、シーケンスをリセットする方法がTRIGGERステートメントにあります。

ORストアドプロシージャを実行する必要がありますか?その場合、myBatisマッパーを使用してこれをどのように呼び出すことができますか?

表(CUSTOMER_INFO)

customer_id customer_name customer_location 
1   Arbin   USA 
2   Tim   Canada 
3   Rachel  Australia 

シーケンス

CREATE sequence customer_id_seq START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; 

トリガー

CREATE OR REPLACE TRIGGER customer_id 
BEFORE INSERT ON customer_info 
FOR EACH ROW 

BEGIN 
SELECT customer_id_seq.NEXTVAL 
INTO :new.customer_id 
FROM dual; 
END; 
/

ありがとうございます。

+0

この場合、自動インクリメントフィールドを使用しないと何が問題になっていますか?customer_id_seq?リセットバックはちょうどTRUNCATEテーブルでなければなりません。 maSTAShuFu

+0

@maSTAShuFu SQLはSQLではなく、ID列ではありません。 –

+0

意味がある...期待していなかった – maSTAShuFu

答えて

2

一度テーブルを切り捨てます。シーケンスを1にリセットする必要があります。

もう一度削除して再作成することで、最も簡単な方法です。

DROP SEQUENCE customer_id_seq 
CREATE sequence customer_id_seq START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; 
+1

シンプル?多分。ベストオプション?より良いオプションは、シーケンスを変更し、 'increment by '値を - << current-value >>に変更し、次の値を生成し、' increment by'値を1に戻すことです。他のユーザーにそのシーケンスに対する特権を与えることができます。シーケンスを削除してから再作成すると、再度そのユーザーに再付与する必要があります。 –

+0

@Mikolas Pansky、もし私がその方法を実装すれば、それは堅牢ではなく、DROPとCREATEのたびに時間がかかるでしょう。だから私はそれを自動化しようとしていた。 –

+0

もちろん、負の値を使ったインクリメントは、より洗練されたソリューションです。 DDLを使用しなくても。 –

関連する問題