みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

テーブルロックが必要ですか?

mysqlとphpを使ってwebシステムを製作しているのですが、素人なもので以下の方法で効率がいいプログラムなのかわかりません。ご意見をいただけないでしょうか。

-----------------------------------------------

テーブル a (id,comment,no)

$query="LOCK TABLES a READ, a WRITE";
$rst = mysql_query($query,$con);

$query="SELECT count(*) as number FROM a WHERE id='任意の数字'";
$rst = mysql_query($query,$con);
$col = mysql_fetch_array($rst);
$no = $col["number"]+1;


$query = " INSERT INTO a(id,comment,no) VALUES('任意の数字','コメント','$no')";
$rst = mysql_query($query,$con);


$query="UNLOCK TABLES";
$rst = mysql_query($query,$con);


idごとの投稿数+1をコメントnoとして割り振りたいです。結果をweb上にSELECTするとこんな感じになります。

id=1 の画面

no1 こんにちは
no2 はい、こんにちは
no3 昨日は何をしてましたか
以下、続く

id=2 の画面

no1 暇だけどだれかいますか
no2 はい、います
no3 何してますか?
以下、続く

------------------------------------------------------------

(質問1) テーブルロックを使用せずに、1つのSQL文で済ませられないでしょうか?

(質問2) テーブルロックの最初の行はどちらがいいのでしょうか? (両方動作しますが、どちらを選びますか?)
 (1) $query="LOCK TABLES a READ, a WRITE";
 (2) $query="LOCK TABLES a ";


環境: mysql5.0(MyISAM)/ php5.1系

投稿日時 - 2007-05-14 15:57:45

QNo.2999359

暇なときに回答ください

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

#1回答者です。

auto_incrementの注意事項を書き忘れました。
auto_incrementを使用時、ロールバック等が発生すると、欠番ができてしまいます。したがって欠番が許されないような業務なら、auto_incrementは使用できません。

参考URL:http://dev.mysql.com/doc/refman/4.1/ja/example-auto-increment.html

投稿日時 - 2007-05-15 18:09:13

お礼

>>auto_increment列には、nullを挿入することで、自動的に最大値+1の値が格納されます。

auto_incrementは総合的に数を増やす機能かと思っていたのですが、個別に数を増やすこともできるのですね。auto_incrementを使用していないテーブルは早速この方法を導入させていただきます。

>>auto_incrementを使用時、ロールバック等が発生すると、欠番ができてしまいます。したがって欠番が許されないような業務なら、auto_incrementは使用できません。

なるほど、InnoDBなどでトランザクションを使用するときは、この方法はやめておいた方がいいのですね。 ありがとうございました。

投稿日時 - 2007-05-15 18:59:43

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

通番を自動的に生成する機能として、幾つかのRDBMSでは「シーケンス」という機能を持っています。MySQLでは、auto_incrementという形で、シーケンスに相当する機能を持っており、これを利用するのが簡単です。MyISAMなら、auto_incrementの列を2番目の構成列としてprimary keyにすれば、先頭の構成列毎に2番目の構成列に通番を自動生成してくれます。

【表定義例】
create table a
(id int,
no int auto_increment,
comment varchar(256),
primary key(id,no));

【挿入例】
auto_increment列には、nullを挿入することで、自動的に最大値+1の値が格納されます。

insert into a values(101,null,'a');
insert into a values(201,null,'a');
insert into a values(301,null,'a');
insert into a values(101,null,'aa');
insert into a values(101,null,'aaa');
insert into a values(201,null,'aa');
insert into a values(301,null,'aa');

投稿日時 - 2007-05-15 18:03:48

あなたにオススメの質問