[PHP-users 5619] Re: データベース操作中の問題点

Naofumi Kondoh php-users@php.gr.jp
Fri, 22 Feb 2002 00:05:39 +0900


ソフト工房の近藤です。

Jin Jingmei wrote:
 
....略....

> DBはPostgresで、以下のようなテーブルが存在するとします。
> 
> create table test (mid serial, content text);
> 
> 1.通し番号の取得
>   只今自分が Insert したレコードの通し番号を取得するには
>   どんな方法が一番良いですか。

(1) nextval で、次の SEQUENCE を取得。
(2) その値が重複していないことを SELECT して確認。
    SEQUENCE 以外で INSERT せず、KEY の UPDATE も
    していない保証があれば、重複チェック省略可。
(3) (1)の nextval で取得した番号で INSERT。

きしださんの方法もよく使ってます。


> 2.トランザクション
>   トランザクションの処理は以下のステップで十分ですか。
>   pg_exec($dbconnect,"BEGIN");
>   pg_exec($dbconnect,"Insert into ....");
>   pg_exec($dbconnect,"Update ...")
>   ...
>   pg_exec($dbconnect,"COMIT");

各 PG_EXEC が失敗した時の処理の記述が必要ですね。
特に、COMMIT が失敗した時の処理は忘れがちなので
(そんなことないかな?)注意が必要。

SET ISOLATION で、どのレベルに設定するかも大事です。

REFERENCES 制約は、実行時に遅延参照指定するかなど
も検討すべきです。

一概には言えませんが、INSERT/UPDATE/DELETE する前に、
重複キーや参照制約違反など事前チェックをして、不適切
なら、ROLLBACK してエラー処理に進むという方法もよい
のではないでしょうか。


> 3.エラー処理
>   テーブルへの更新操作(Insert、Update、Deleteなど)が
>   成功したか、失敗したか判断する時はどんな方法が一番
>   良いですか。

一番いい方法というのは、システムによって異なり、
それを見つけるのがシステム設計ですね。

例えば、

pg_exec の return 値が 無効ならエラー。

INSERT/UPDATE/DELETE は、pg_cmdtuples() で処理した
行数が適正か確認する。

SELECT なら、pg_numrows() で、取得した行数が適正か
確認。

# 問題は何が適正かうまく判定する材料があるかです。

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 (株)ソフト工房   近藤直文        Email:  nkon@shonan.ne.jp 
  《 PostgreSQL+PHPソースコードジェネレーターデモGPL版 》
           http://www.SOFTKOUBOU.co.jp/
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/