プロが教えるわが家の防犯対策術!

やりたい事:
複数レコードのある項目を1度にupdateたい。
現在のA項目の最大値に+1した値から順にインクリメントした値を入れたい。

例: sampleというテーブルにkey,dataという項目があったとします。
update前 >>> update後
key|data______key|data
--+----______--+----
_A_|_1___________A_|_1_
_B_|_2___________B_|_2_
_C_|_3___________C_|_3_
_A_|_0___________A_|_4_
_A_|_0___________A_|_5_
_A_|_0___________A_|_6_

(スペースが入らなくて_にしました見にくいですが)

同じ値をupdateするなら
update sample set data=値 where key=A and data=0
これを
update sample set data=MAX(data)++ where key=A and data=0
みたいに書けたらいいなぁと思うのですが、1度該当レコードをselectして取得した値を条件に順番に1行づつupdateしないとだめですかね・・・

ちなみに環境はRedHat7.0J上のPostgreSQL7.0.2 です。

A 回答 (1件)

ご想像通り、無理です。


ストアドプロシージャで解決できます。(多分)
ただし、Primary Keyフィールドも必要でしょう。

まずMAX値を取得しておきます。
これを変数か何かにキープしておきましょう。

DECLARE cursor_id INTEGER;
SELECT MAX(data) INTO cursor_id FROM sample

以下のSELECT文で変更対象となるデータのidの値に
カーソルをセットし、カーソル末尾までFETCHし、
繰返します。

DECLARE c1 CURSOR FOR
SELECT id FROM sample WHERE data=0 AND key=A;

繰り返す際に、
OPEN c1;
FETCH c1 INTO cursor_id;
WHILE cursor_id DO
UPDATE sample SET data=max_val+1
WHERE id = cursor_id;
FETCH c1 INTO cursor_id;
SET max_val = max_val + 1;
END WHILE;
CLOSE c1;
とやればできるのではないでしょうか?

P.S.
postgresで試していないので、エラーがでます。
およそこんな感じということで、、、
    • good
    • 0
この回答へのお礼

そうですね・・・。
ストアド(PostgreSQLだとPL/pgSQLかな・・・)にするかどうかは検討します。CGIから呼ぶのでプログラムの中でも出来るので。

有難うございました

お礼日時:2001/06/08 09:13

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