この特定のパターンは、既存の代理キーまたはシーケンスが将来生成する可能性のある代理キーと衝突する可能性のある新しいIDを誰かが手動で入力できるため、実際には非常に危険です。
新しいレコードごとに一意のキーを確実に取得するには、トリガーは実際には次のようになります。 11.2以降を使用している場合は、select ... into ...
は必要ありません。
CREATE OR REPLACE TRIGGER TEST_TRIG
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
:new.column1 := my_table_seq.NEXTVAL;
END;
このアプローチの利点は、常にであるということです。 終わり。この列に誰かが入力した値はすべて、機能し、正しいシーケンスを使用するものに上書きされます。誰かがそれをステートメントに追加するのを忘れた場合でも、機能します。
代理キーを壊すことは不可能です。
あなたが提案することで、誰かが代わりに1を置くと想像してください。主キー違反が発生します。誰かが忘れた場合は、さらにエラーが発生します。テーブルへのすべての更新が単一のエントリポイントを介して行われることを保証することは決してないため、トリガーによってPKが正しく入力されることが保証されます。
12cから、identityを使用できることに注意してください。列 、テーブルと自動インクリメントの間のリンクを明示的にします。トリガーやシーケンスは必要ありません。テーブル作成DDLの構文は次のようになります。
create table <table_name> ( <column_name> generated as identity );