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文を発行してしまっています。
こういう場合、他にどのような方法があるのでしょうか?
宜しくお願いします。
No.1ベストアンサー
- 回答日時:
>なぜかNGになってしまいます(右カッコがありませんと言われます)。
>なぜこの書き方が出来ないのでしょうか?
できない。
右カッコ云々のエラーは、サブクエリ上であり得ない問い合わせを書くと
よく出るモノです。
ロックが獲得できるかどうかで、削除するかどうかが変わるわけで、
削除するかどうか決まっていない時点で、DELETE文の発行は出来ない、
という考え方も出来ますよね..
条件付き削除として考えれば、SELECT&DELETEは面倒な
書き方ではありますが。
回答ありがとうございます。
>ロックが獲得できるかどうかで、削除するかどうかが変わるわけで、
>削除するかどうか決まっていない時点で、DELETE文の発行は出来ない、
>という考え方も出来ますよね..
なるほど。
>条件付き削除として考えれば、SELECT&DELETEは面倒な
>書き方ではありますが。
こういう書き方は普通に使われているのですね。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle SQL update方法 2 2022/06/22 14:07
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- MySQL SELECT my_items.item_name, carts.count カンマ, の意味? 2 2023/01/23 07:12
- PostgreSQL 列が存在しないと言われる 2 2023/02/10 18:33
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- MySQL SQLについて教えて下さい。 SELECT分で、あるカラムにある日付の 半年先のデータを取って来たい 3 2022/12/07 22:28
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
このQ&Aを見た人はこんなQ&Aも見ています
-
風水の観点で選ぶ観葉植物とは?置き場所や上げたい運気ごとの注意点を紹介!
観葉植物で運気をアップするコツを、風水デザイン1級建築士の福島昌彦さんに伺った。
-
エラーを起こす方法
Oracle
-
トランザクションログを出力せずにデータを削除する方法
Oracle
-
同じSELECT文同士でのデッドロックが発生
Oracle
-
-
4
数百万件レコードのdelete
SQL Server
-
5
count(1)とcount(*)の違い
Oracle
-
6
selectした結果の余計な余白を取るにはどうしたらよいのでしょうか
Oracle
-
7
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
8
INSERTにおいてロック処理は必要か
MySQL
-
9
SELECT文でのデッドロックに対しての対処方
SQL Server
-
10
同じSQL文で極端に検索が遅くなる時がある
MySQL
-
11
GROUP BYでエラーが発生
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
update文で改行を入れる
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
SQL update方法
-
UPDATE文
-
INDEX RANGE SCAN とは?
-
SQL 複数テーブルのupdate
-
sqlplusで表示が変なので、出力...
-
特定のカラムが更新されたとき...
-
SQLで違うテーブルの値を比較し...
-
execute immediate内の"'"
-
文字列分割
-
PLSQLのNumber型の初期化
-
カラム位置変更
-
UPDATE文で、書き換えるデータ...
-
SQL*LoaderでCSVから指定した列...
-
ワークテーブルって何?
-
SQL文のCOUNTの戻り値は?
-
DELETE文とロックについて
-
半角英数文字の抽出がしたい。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
update文で改行を入れる
-
ROWNUMでUPDATEをしたいのです...
-
sqlplusで表示が変なので、出力...
-
SQL 複数テーブルのupdate
-
SQL*LoaderでCSVから指定した列...
-
SQLでSUMなどの関数でデータが...
-
SQLで違うテーブルの値を比較し...
-
カラム位置変更
-
UPDATE文
-
件数とデータを同時に取得する...
-
特定のカラムが更新されたとき...
-
Oracle(オラクル)で、日付時刻...
-
半角英数文字の抽出がしたい。
-
数値をNUMBER型にするかCHAR型...
-
DELETE文とロックについて
-
Oracleのview、synonymをCOMPIL...
-
SQL(oracle)でご助言いただきた...
-
SELECT文で指定桁数分抽出する...
おすすめ情報