アプリ版:「スタンプのみでお礼する」機能のリリースについて

DELETEしようとしているレコードがロックされている場合は、削除せず
すぐに処理を戻したいです。イメージ的にNOWAITが最適と思い

→DELETE FROM テーブルA WHERE カラムA = 'A' NOWAIT

としたいところですが、NOWAITはSELECT文でしか指定できないとのことなのでNGです。

SELECT文で抽出した条件のレコードを削除する場合

→DELETE FROM テーブルA WHERE カラムA =
     (SELECT カラムA FROM テーブルA WHERE カラムA = 'A')

と出来ます。

又、SELECT文でロック待機時間なしの場合

→SELECT カラムA FROM テーブルA WHERE カラムA = 'A' FOR UPDATE NOWAIT

と出来ます。

これらを組み合わせて、ロックされているレコードを削除しようとした場合、
すぐにNGで制御を戻すように、次のように記載してみました。

→DELETE FROM テーブルA WHERE カラムA =
   (SELECT カラムA FROM テーブルA WHERE カラムA = 'A' FOR UPDATE NOWAIT)

なぜかNGになってしまいます(右カッコがありませんと言われます)。
なぜこの書き方が出来ないのでしょうか?

現在、一度該当のレコードをSELECT文でFOR UPDATE NOWAITをしてから
DELETEをしています。
1つレコードを削除したいだけなのに、わざわざSELECT文と
DELETE文を発行してしまっています。
こういう場合、他にどのような方法があるのでしょうか?

宜しくお願いします。

A 回答 (1件)

>なぜかNGになってしまいます(右カッコがありませんと言われます)。


>なぜこの書き方が出来ないのでしょうか?

できない。
右カッコ云々のエラーは、サブクエリ上であり得ない問い合わせを書くと
よく出るモノです。

ロックが獲得できるかどうかで、削除するかどうかが変わるわけで、
削除するかどうか決まっていない時点で、DELETE文の発行は出来ない、
という考え方も出来ますよね..

条件付き削除として考えれば、SELECT&DELETEは面倒な
書き方ではありますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>ロックが獲得できるかどうかで、削除するかどうかが変わるわけで、
>削除するかどうか決まっていない時点で、DELETE文の発行は出来ない、
>という考え方も出来ますよね..

なるほど。

>条件付き削除として考えれば、SELECT&DELETEは面倒な
>書き方ではありますが。

こういう書き方は普通に使われているのですね。
ありがとうございました。

お礼日時:2006/03/10 11:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す