以下のテーブルで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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
max+1で初番する場合 for updateは必要ですか?
MySQL
-
INSERT時にデータ登録とmaxの発番がしたい
SQL Server
-
SELECT FOR UPDATE で該当レコードがなかった場合
Oracle
-
-
4
INSERTにおいてロック処理は必要か
MySQL
-
5
SELECT時の行ロックの必要性について
MySQL
-
6
「:」について
Visual Basic(VBA)
-
7
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
8
あるカラムのMAX値+1をINSERTしたい。
その他(データベース)
-
9
ループ処理の際、最後だけ,"をつけたくない"
Java
-
10
IEからEdgeへの移行に伴うIMEの状態(ime-mode)
HTML・CSS
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
VIEWの元のテーブルのindexって...
-
insertを高速化させたい
-
副問合せの書き方について
-
SQL Left Join で重複を排除す...
-
ある条件の最大値+1を初番する...
-
selectした大量データをinsert...
-
マイクラPC版のコマンドで効率...
-
select文のwhere句に配列を入れ...
-
一つ前のレコードの値と減算し...
-
my_itemsテーブルのIDにAUTO_IN...
-
期間の重複を調べるSQL文につい...
-
1対多結合で多を絞り込み条件と...
-
SELECT~LIKE~の結果が変
-
1テーブル&複数レコードの更新...
-
MySQLにてCOUNTした値を更にCOUNT
-
エクセルの関数について教えて...
-
Unionした最後にGROUP BYを追加...
-
SQLサーバから、項目の属性(型...
-
バインド変数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
VIEWの元のテーブルのindexって...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
副問合せの書き方について
-
マイクラPC版のコマンドで効率...
-
Unionした最後にGROUP BYを追加...
-
selectした大量データをinsert...
-
SQLにて特定の文字を除いた検索...
-
[SQLServer] テーブル名からカ...
-
1テーブル&複数レコードの更新...
-
inner joinをすると数がおかし...
-
クエリ表示と、ADOで抽出したレ...
-
ある条件の最大値+1を初番する...
-
sqlで、600行あるテーブルを100...
-
複数テーブルのGROUP BY の使い...
-
insertを高速化させたい
-
PL/SQLの変数について
-
キー毎の、ある列のmaxのレコー...
おすすめ情報