DEFERRABLE 対 IMMEDIATE 主キー制約の適用
PostgreSQL における遅延/遅延可能な一意キー制約または主キー制約の適用は、設定と実行されている操作の種類。
の場合DEFERRABLE INITIALLY IMMEDIATE として定義された制約では、各 SQL ステートメントの実行後に一意性がチェックされます。ただし、UNIQUE または PRIMARY KEY 制約の場合、遅延設定に関係なく、すべてのコマンドの直後に一意性チェックが行われるとマニュアルに記載されていることに注意することが重要です。
クエリで提供されている例は、UPDATE ステートメントが実行されることを示しています。制約が PRIMARY KEY DEFERRABLE INITIALLY IMMEDIATE として定義されている場合でも、複数の行の変更は成功します。これは、ステートメントの実行後にチェックが行われ、この場合、制約がまだ満たされているためです。
対照的に、PK 制約が指定されている場合、複数のテーブルの行を更新しようとするデータ変更 CTE は失敗する可能性があります。延期されていません。これは、CTE 内の各サブステートメントが同時に実行され、スナップショット分離がないと更新の順序が予測できないためです。その結果、一意キー違反が発生する可能性があります。
制約を遅延として明示的に設定せずに単一トランザクション内で複数の UPDATE ステートメントが実行される場合、制約が遅延されていないと UNIQUE 違反が発生する可能性があります。これは、チェックが各ステートメントの後に実行され、トランザクションの中間状態で制約に違反する可能性があるためです。
したがって、PostgreSQL における遅延不可能な UNIQUE 制約または PRIMARY KEY 制約の動作は次のとおりであることは明らかです。本質的に欠陥がある。チェックは各行が更新された後に実行されるため、特定のシナリオでは予期しないエラーが発生する可能性があります。ただし、この問題の回避策は DEFERRABLE 制約を使用することです。これにより、一意性をより柔軟に適用でき、不要なエラーを防ぐことができます。
以上がPostgreSQL の遅延主キー制約と即時主キー制約の適用は、トランザクションの動作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。