![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
以下のテーブルでcolumn毎に連番を振る場合、
テーブルロックが必要でしょうか?
テーブル test
id column
1 a
2 a
1 b
新規データ登録手順
1.トランザクション
2.select max(id)+1 from test where column = b for update
3.insert test into (id,column) values (selectで取得した値,b)
4.トランザクション終了
これで、column毎に登録されているIDの最大値+1で
重複せずにデータのINSERTが保障されるでしょうか?
No.3ベストアンサー
- 回答日時:
一応動くと思いますが
・ロックの粒度が大きい。'b'についてMAX(ID)を取得して挿入する処理の間
他のカラムの取得もロックされる。
同時実行性に問題はないか。
後、ロック時間が長くなるとMysqlのinnodb_lock_wait_timeoutによって
処理がエラーになる場合がある。
点が気になります。
独自に( column, max_id )を持つ発番テーブルを持った方がいいのではな
いかと思います。columnが主キーです。
そうなんです。ロック行が多すぎるので心配しておりました。
なるほど。確かにおっしゃる通り、InnoDBの場合、
発番テーブルを持つ方が良さそうです。ありがとうございました。
No.4
- 回答日時:
テーブルは、InnoDBである必要がありますか?
MyISAMでもよいなら、複合(複数列)インデクスにして、2番目の構成列をauto_incrementにすることで、実装が容易になります。
create table `test`
(`id` int auto_increment,
`column` varchar(5),
primary key(`column`,`id`))
上記のような定義にすることで、`column`列の値毎に`id`列に通番が自動採番されます。
http://dev.mysql.com/doc/refman/4.1/ja/example-a …
No.2
- 回答日時:
テーブルtestではidがダブっている時点で本来のidとしての機能を果たしていませんね
column管理用に別テーブルをつくり、idをプライマリにしてauto incrementを
つけて管理するのがよろしいのでは?
この回答への補足
すみません、説明が不足しておりませした。
プライマリーキーは、id,columnになります。
column a のIncrement値は2
column b のIncrement値は1
つまり次ぎに、aのユーザーが登録したら、3番を初番
bのユーザーが登録したら、2番を初番したいのです。
ちなみに、columnのパターンは無限にありテーブルをわけるわけにも
いきません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Oracle SQL update方法 2 2022/06/22 14:07
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Excel(エクセル) 何故割り算なのでしょうか? 6 2022/11/09 13:30
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
max+1で初番する場合 for updateは必要ですか?
MySQL
-
SELECT FOR UPDATE で該当レコードがなかった場合
Oracle
-
INSERT時にデータ登録とmaxの発番がしたい
SQL Server
-
-
4
Oracleの排他制御について教えてください
その他(データベース)
-
5
likeとsubstrの使いわけについて
Oracle
-
6
あるカラムのMAX値+1をINSERTしたい。
その他(データベース)
-
7
CloseとDisposeの違い
Visual Basic(VBA)
-
8
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
9
datetime型でNULL値を入れたい。
SQL Server
-
10
SELECT時の行ロックの必要性について
MySQL
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
Unionした最後にGROUP BYを追加...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
”photo id” とは何ぞや?
-
阪急三番街 ATM(ゆうちょ)は...
-
SQLサーバから、項目の属性(型...
-
レコード数が増えすぎた場合の対処
-
Mysqlでunionを使った検索速度...
-
Updateの複数テーブル条件時のL...
-
Postgreのupdateコマンドでエラー
-
曜日ごとのカウントの平均を求...
-
mysqlのload data infileで連番...
-
クエリ表示と、ADOで抽出したレ...
-
PL/SQLの変数について
-
php mysqlを使用してのリーグ表...
-
MySQL 複数個の値を取るカラム...
-
[SQLServer] テーブル名からカ...
-
グループ中で最大値を含む行を...
-
WordpressのContact form 7でzi...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
SQLサーバから、項目の属性(型...
-
副問合せの書き方について
-
VIEWの元のテーブルのindexって...
-
エクセルの関数について教えて...
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
select文のwhere句に配列を入れ...
-
sqlで、600行あるテーブルを100...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
Unionした最後にGROUP BYを追加...
-
期間の重複を調べるSQL文につい...
-
クエリ表示と、ADOで抽出したレ...
-
Access パラメータクエリをcsv...
-
PL/SQLの変数について
-
MySQLのDATE型カラム値がNULLの...
-
php+mysqlで複数選択削除について
-
上位3位を求めるSQL文は?
おすすめ情報