PHPでDB更新処理を作っています。

同じ条件がDBに登録済みであれば上書き、条件に合致する情報がない場合は新規登録とする処理です。
ここでは、条件をIDとNOとしています。
////////////////////////////////////////
$db = DB::connect(mysql://$user:$pass@$host/$db);
$st = $db->prepare("SELECT COUNT(*) FROM table WHERE id=? AND no=?");
$rs = $db->execute($st, array($id, $no));
$cnt = 0;
while ($row = $rs->fetchRow()) { $cnt++; }
if ($cnt) {
// 同じ条件が登録済み
$st = $db->prepare("UPDATE table SET dt1=?, dt2=?, ... WHERE id=? AND no=?");
$db->execute($st, array($new1, $new2, ... $id, $no));
} else {
// 同じ条件は未登録
$st = $db->prepare("INSERT INTO table (dt1, dt2, ...) VALUE (?, ?, ...) WHERE id=? AND no=?");
$db->execute($st, array($new1, $new2, ... $id, $no));
}
////////////////////////////////////////
一応、これはこれで正常動作するのですが、もっとシンプルに作ることはできないでしょうか?
次の①と②のシンプル化についてご教示願います。
①同じ条件がDBに登録済みかどうかの確認
②新規書き込みと更新処理
よろしくお願いいたします。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:2009/10/15 14:35:53
  • 終了:2009/10/15 16:57:35

ベストアンサー

id:taknt No.2

きゃづみぃ回答回数13537ベストアンサー獲得回数11982009/10/15 15:08:00

ポイント27pt

DBがOracleでしたらMERGE文が使えます。

http://www.shift-the-oracle.com/sql/merge.html

質問にあるような更新処理が一回でできます。

MySQLでしたら ON DUPLICATE KEY UPDATEで 似たようなことができると思います。

http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html

id:cochoo

ご回答ありがとうございます。

みなさん、同じご指摘でこれが確実な方法と思います。

ちゃんと期待する動作を簡潔に書くことができました。

なお、今回のDBはMySQLですが、Oracleも使っていますので、ぜひ活用させていただきます。

ありがとうございました。

2009/10/15 16:54:35

その他の回答(3件)

id:HALSPECIAL No.1

HALSPECIAL回答回数407ベストアンサー獲得回数862009/10/15 14:48:40

ポイント23pt

こちらはいかがでしょう。

12.2.4.3. INSERT ... ON DUPLICATE KEY UPDATE 構文

id:cochoo

ご回答ありがとうございます。

なるほど、勉強不足でした。

ちゃんと期待する動作を簡潔に書くことができました。

ありがとうございます!!

2009/10/15 16:54:24
id:taknt No.2

きゃづみぃ回答回数13537ベストアンサー獲得回数11982009/10/15 15:08:00ここでベストアンサー

ポイント27pt

DBがOracleでしたらMERGE文が使えます。

http://www.shift-the-oracle.com/sql/merge.html

質問にあるような更新処理が一回でできます。

MySQLでしたら ON DUPLICATE KEY UPDATEで 似たようなことができると思います。

http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html

id:cochoo

ご回答ありがとうございます。

みなさん、同じご指摘でこれが確実な方法と思います。

ちゃんと期待する動作を簡潔に書くことができました。

なお、今回のDBはMySQLですが、Oracleも使っていますので、ぜひ活用させていただきます。

ありがとうございました。

2009/10/15 16:54:35
id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542009/10/15 15:10:51

ポイント23pt

// 同じ条件は未登録

$st = $db->prepare("INSERT INTO table (dt1, dt2, ...) VALUE (?, ?, ...) WHERE id=? AND no=?");

$db->execute($st, array($new1, $new2, ... $id, $no));

}

////////////////////////////////////////

一応、これはこれで正常動作するのです

INSERTのVALUESの指定の後に、WHERE句の指定があるのは、コピペミスですよね?

MySQLの独自機能ですが、INSERT文でON DUPLICATE KEY UPDATEという独自構文があります。

これは、重複キー値が存在すればUPDATE、存在しなければINSERTするという動作をします。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.4.3 INSERT ... ON DUPLICATE KEY UPDATE 構文

id:cochoo

ご回答ありがとうございます。

みなさん、同じご指摘でこれが確実な方法と思います。

ちゃんと期待する動作を簡潔に書くことができました。ありがとうございました!

INSERTはコピペミスです。すいません。

2009/10/15 16:55:51
id:standard_one No.4

standard_one回答回数252ベストアンサー獲得回数232009/10/15 15:11:34

ポイント23pt

「同じ条件」というのがユニークキーであればon duplicate key updateを使えばいいと思います。

http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html

id:cochoo

ご回答ありがとうございます。

みなさん、同じご指摘でこれが確実な方法と思います。

ちゃんと期待する動作を簡潔に書くことができました。ありがとうございました!

本当にありがとうございました。

2009/10/15 16:56:41

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません