データベースプログラミング全般スレ

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
NGNG
データベース板もあるが、あそこは過疎板だからこっちに立てました。
データベース関連のプログラミングならな〜んでもOK。
色んな話をしませまうる号。
282デフォルトの名無しさん
垢版 |
2008/10/30(木) 03:15:28
DB超初心者からの質問です。
employeeテーブルがあるとします。
列はid(PK)とnameからなるとします。
社員を追加削除を繰り返しているとidも欠番が出たりすると思います。
欠番は別に良いのですが、社員を追加するときにidに、現在テーブルにないidを探してinsertしないとダメですよね?
このidをどうやって作るのですか?

IDENTITYプロパティーをつければシステムによっては自動インクリメント値ということを本で読みました。
でもシステムによっては・・じゃ、だめっすよね。

あとシステムが自動でつけたidを得る必要がある場合、どうするんでしょう。

結局自分でユニークな値を作るの?
2008/10/30(木) 03:44:55
>>282
> このidをどうやって作るのですか?
方法はいろいろとあると思います。
例)INSERT時の時刻、レコード件数、最大値

過去の最新のIDを格納するテーブルを作って、それを+1したものを新規ID
とするということを過去にやったことがあります。

この場合、同じ時刻の登録操作によってIDが重複する可能性があります。
当然INSERTは蹴られるわけですが、そのときはリトライすればよい。また
適正なロックをかけることにより、このINSERTの失敗をを避けることができます。

こういう面倒なことをしなくてもよいために、DBによってはユニークIDを生成する機能
を持っています。(現在のほとんどのDBは持っていると思います)

> あとシステムが自動でつけたidを得る必要がある場合、どうするんでしょう。
SELECTして見る。
2008/10/30(木) 05:48:40
>>283
ご回答ありがとうございます。

DBが用意してくれているユニークなIDを使うのがよさ気ですね。

もしemployeeのidが他のテーブルから外部キーに指定されている場合、
employeeに挿入したときにDBがつけてくれるidを使って他のテーブルにも挿入とかしたい場合もあると思いますが、
このときはselectでなんとか、その挿入したレコードを引っ張ってくるんですね。
その場合、テーブルをロックしてダーティーリードを防ぐ必要があるということかなぁ。

初心者なのでアホな事を言っているかもしれませんが。
2008/10/30(木) 06:14:33
>>284
INSERT INTOとSELECTサブクエリを使えばひとつのSQLステートメントで
idに値が入った行を作成することができます。

DBのユニークID生成機能にも欠点がありまして、データのExport/Importをするとき
少々厄介です。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況