9

NOT NULL, FOREIGN KEY, UNIQUE, CHECK制約とBEFOREトリガーを検証する特定の順序に依存できるかどうか知りたいです。

NOT NULL経験から、MySQLは最初にチェックし、次にBEFOREトリガーを起動し、次にUNIQUE制約をチェックすることを知っています。NOT NULLOracleはトリガーの後にチェックしますBEFORE(SQLServerも同じことをすると思いますが、覚えていません)。標準は注文について何かを述べていますか、それとも完全にDBベンダー次第ですか?

4

1 に答える 1

2

この特定の動作はMySQLのバグのようであり、トリガーにのみ影響BEFORE INSERTしますが、BEFORE UPDATEトリガーは正しく動作します。

標準(質問のコメントにリンクされている)は確かにそれを明示的に説明していませんが、それは間違いなく暗示されています:

TECiの状態変化SCi、jごとに、SCi、jによってアクティブ化されたBEFOREトリガーが、トリガーイベントのいずれかが有効になる前に実行されます。これらのトリガーイベントが有効になると、TECiの状態変化によってアクティブ化されたAFTERトリガーが実行されます。

NOT NULLエラーはINSERTor UPDATE(つまりトリガーイベント)の一部である必要があります。標準ではこれを指定する必要はありません。トリガーはエラーの解決と新しいエラーの導入の両方を行うことができるため、最終的ではない一連の変更に対する制約を先制的にチェックする意味はまったくありませんBEFORE

概要:beforeトリガーの後に制約をチェックすることが常に必要であるため、実際にはDBベンダー次第ではありません。

于 2011-11-24T17:21:31.103 に答える