-PR-
解決済み

複数updateする時に・・・

  • 困ってます
  • 質問No.86846
  • 閲覧数372
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 100% (6/6)

やりたい事:
複数レコードのある項目を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 です。
通報する
  • 回答数1
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル12

ベストアンサー率 41% (324/772)

ご想像通り、無理です。
ストアドプロシージャで解決できます。(多分)
ただし、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で試していないので、エラーがでます。
およそこんな感じということで、、、
お礼コメント
chopin22

お礼率 100% (6/6)

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

有難うございました
投稿日時 - 2001-06-08 09:13:21
-PR-
-PR-
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ