[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/
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/