[pgsql-jp: 30265] Re: SQLのMAX 関数について

fumiyaKitamura fkit.s @ sys238.jp
2003年 6月 29日 (日) 16:15:35 JST


キタムラです。

nullが帰ってきた場合に0を戻したいならばinsert文を

> INSERT INTO table VALUES(SELECT MAX(id)+1 FROM talbe);

INSERT INTO table VALUES(SELECT coalesce(MAX(id),0)+1 FROM talbe);

とすれば0が戻ると思います。
coalesceは値がnullの場合に代替えの値を返す関数です。

updateの方は0件の時にはアップデートするレコード自体が無いので、そもそも
前提が無理ですね。


あと、よけいなお節介ですが、新規レコード作成時にmaxで値を取得しようとす
ると同時に新規作成が発生した場合、同一IDが発生してしまいます。

今回の場合「IDが主キーではない」「IDに同じ値が発生してもオッケー」または
「一度に新規作成するのは必ず1クライアントのみ」ならばmaxでも良いのですが、
そうでないならシーケンスを利用したID値生成したほうがいいです。



On 2003.6.29, at 15:41 Asia/Tokyo, Masato Tanaka wrote:

> こんにちは。田中と申します。
>
> 早速質問させてください。
>
> 以下のようなテーブルがあったとします。
>
> [table]
> id | value
> -----------
> 1  | abc
> 2  | def
>
> 新規レコードの登録時に、(idのMAX値+1)を割り当てを1文のSQLで
> 行いたいと思い以下のようなSQLを発行しました。
>
> INSERT INTO table VALUES(SELECT MAX(id)+1 FROM talbe);
> UPDATE table SET value='efg' WHERE id=(SELECT MAX(id) FROM table);
>
> これで、うまくいったかと思ったのですが、レコードがないときに
> MAX(id)の値が0にならずNULL?になるためエラーにってしまいます。
>
> 説明不足でしたらすみません。
> なにか良い方法をご存知でしたらご教授いただけると嬉しいです。
>
> 田中正人

=================<F.Kitamura>=================
E-Mail  : fkit @ sys238.jp
---
The greatest enemy of man is alcohol.
But, The Bible tells us to love our enemy.
==============================================




pgsql-jp メーリングリストの案内