これは既知の制限です。シーケンスは、 nextval()
関数。これは、フィールドのデフォルト値です。 INSERT
でデータを提供する場合 そのフィールドに対して、デフォルト値の式は評価されないため、シーケンスの値は変更されません。
回避策は、 INSERT
の前後にトリガーを設定することです。 setval()を使用してシーケンスの値を手動で修正するにはコード>
。しかし、このようにあなたはすべき UPDATE
でトリガーを設定する必要があります そのフィールドでも、既存のIDをより高いIDに更新するだけで、シーケンスの値を修正できます。
もう1つの回避策は、そのフィールドで使用可能な値を生成し、フィールドのデフォルト値をその関数の戻り値に設定できるストアド関数を作成することです。次のような何か:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
ただし、注意が必要です。シーケンスのデフォルト機能は、同時挿入に対して安全です(シーケンスの現在の状態はグローバルであり、トランザクションに依存しません)。これらのフィールドに明示的な値を指定した場合、それは当てはまりません。