2012-04-23 1 views
1

私は、刑罰を免れて存在しないレコードを「削除」することができます。これに隠された危険性はありますか?Oracleで存在しないレコードを削除すると、悪い書式とみなされますか?

レコードが存在するかどうかを最初に確認する方が良い場合は、それを行うための超高速方法がありますか?

if recordExists(table, rowval[s]) 
    deleteRecord 

IOW、すぐにこの擬似SQLを実行する方法はありますか?

DELETE FROM Table WHERE Id = 234 

これは、指定した行を削除するか、またはそれはないでしょう:

+0

提案:begin transaction;削除;ターゲットテーブルで影響を受ける行の数を確認します(ゼロ行を削除すると、アプリケーションエラーが発生している可能性があります)。他のエフェクトのテスト(トリガまたは外部キーの参照トリガされたアクションが他のテーブルの影響を受けたかどうか、エラーが発生しましたか?すべてが良い場合はトランザクションをコミットします。 – onedaywhen

答えて

6

一般に、削除する前に何かが存在するかどうかを確認する本当の理由はありません。 SQLはセットベースの言語であり、空のセットの要素を完全に削除することができます

何かが存在するかどうかを調べるにはルックアップが必要で、最悪の場合は同じルックアップを再度実行して削除する必要があります。条件が長いので、あなたが受け入れることを喜んでいるよう

4

ありませんが、かがあってもなくてもよい行を削除するために、通常のDELETEステートメントを使用しない理由はありません。前者の場合、更新カウントは1になり、後者の場合は0になります。これを使用して、レコードが存在する場合に追加ロジックを実行できます。

1

を(DDLが頭に浮かぶ修正文)を満たしていない場合ステートメントがエラーを引き起こすことが可能だとき、これは良いフォームがあることだけですレコードが存在する場合はDELETEアクション、レコードを削除するかどうかは自由です。

1

「真の」クエリの前に存在チェックを実行するもう1つの危険は、読み取りの一貫性をシリアル化可能に変更する予防措置を講じていない限り、データの可視バージョンが変更できることです。

関連する問題