データベースの主キーについて

このQ&Aのポイント
  • データベースの主キーにはオートナンバー型のIDを使うか、独自の主キーを作るかは、データベースの性質によります。
  • オートナンバー型のIDは、レコードに空きができないデータベースに適しています。
  • 一方、独自の主キーはレコードの削除などにより空きができるデータベースに適しています。
回答を見る
  • ベストアンサー

主キーはオートナンバー型のIDを使った方が良いのか

主キーはオートナンバー型のIDを使った方が良いのか、 独自の主キーを作った方がいいのか? 今は テーブル1 ------------------- IDフィールド(オートナンバー型) 主キー 1 2 3 ------------------- 伝票番号フィールド A001 A001 A002 ------------------- 部署フィールド 営業部 システム部 営業部 ------------------- 金額フィールド 100 200 300 ------------------- という状態ですが、 新たに主キーフィールドを作り 更新クエリで UPDATE テーブル1 SET テーブル1.主キー = [テーブル1]![伝票番号] & [テーブル1]![部署] & [テーブル1]![金額]; をして、主キーを独自に作った方がいいのか。 アクセスを作るにおいて、どちらの方が良いのでしょうか? テーブルのレコードは削除したりする事もあるので、オートナンバー型だと空きができてしまいます。 レコードに空きができないデータベースなら、オートナンバー型、 空きができるデータベースなら、独自に作った主キーにしたほうがいいのでしょうか?

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

  • ベストアンサー
  • chayamati
  • ベストアンサー率41% (254/607)
回答No.3

よい質問です。 この場合は伝票No.を主キーにすると 番号を間違えて入力してレコードが出来てしまえば 主キーの変更はできません。 削除して新規に入力することになります。 主キーは数値、文字列も可能ですがオートナンバー型を勧めます。 ただしフィールド名はIDのままにせずに 伝票IDとユニークなものに変えておきます。 オートナンバーにすると主キーはACCESS側にお任せになるので、 フォーム、レポート上では省略出来るので、番号に空きが出来ても問題ないでしょう 一般的に主キーとは別に伝票No.、商品コード、取引先コードを用意しますが これはフォーム、レポートでのレコードの抽出条件、表示(リスト)の順番のためです。

VKCTPHFIRW
質問者

お礼

良い質問ですかw実はずっと疑問に思ってた事なのです。 オートナンバー型の主キーで、フィールド名は替えた方が良いようですね。 ありがとうございました。

その他の回答 (4)

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.5

>新たに主キーフィールドを作り 手順の一例です 1.旧テーブルをコピペ 2.新テーブルの全レコードを削除 3.新テーブルの主キーを数値型に変更、 4.新テーブルの末尾にオートナンバー型のフィールド例えば[伝票ID]を追加 5.旧レコードの全レコードをコピー 6.新テーブルの[*]の位置へ張り付け 6.新テーブルのIDフィールドを削除 7.[伝票ID]を先頭に移動して主キーに設定

VKCTPHFIRW
質問者

お礼

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

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.4

主キー項目は確かに悩みどころですね。 心中、お察しして余りあるところです。 さてさて、今回ご提示のテーブルのサンプルに関してだけを観点にすると 主キーはオートナンバーに限らず、何か別に持つ必要がありますね。 主キーフィールドは重複不可ですから、 重複が発生している[伝票番号]・[部署]は設定できません。 [金額]を主キーにするという愚かしいことはしないでしょう。 よって、何か別の主キーたりえるフィールドが必要、と言うことです。 そこで一番考えやすいのは、オートナンバーによる[ID]付加ですね。 もう一つ、手段として抑えておきたいのは、 「複数フィールドを組み合わせて主キーとする」と言う方法です。 ご提示のサンプルで言えば、[伝票番号]&[部署]くらいの考え方でしょうか。 つまり、"A001営業部"・"A001システム部"となるフィールド、と言う考えです。 サンプルが多くないので難しいですが、「同じ伝票番号に同じ部署は発生しない」なら このやり方も十分に有効と思います。 テーブルをデザインビューで開き、(エクセルの行指定の要領で)複数フィールドを選択、 主キーに設定すると、例の鍵のマークが複数あらわれます。 これで、複数のフィールドを組み合わせた主キーの設定が出来ます。 レスポンスが多少落ちるようですが、 例えば私の場合、伝票番号&商品番号で処理をしていますが、 約50万件を扱うテーブルでも(私は)気になる範囲ではありません。 とりあえず、ご参考までに。

VKCTPHFIRW
質問者

お礼

ありがとうございました。大変参考になりました。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

>レコードに空きができないデータベースなら、オートナンバー型、 >空きができるデータベースなら、独自に作った主キーにしたほうがいいのでしょうか? 空きができるとなにか困ることがあるのでしょうか? 空きができるかどうかはあまりこだわらないほうがいいでしょう。 主キーはユニーク(重複なし)である必要があります。 伝票番号&部署&金額がユニークでないならオートナンバー型にするしかありません。 ユニークになるならどちらでもかまいませんが、わざわざ独自に作るメリットもないでしょう。 ただし、オートナンバー型というのはアクセス独特の型なので、他のデータベースとの互換性を考えるならあまりお勧めできません。 一般的なデータベースの場合は、伝票番号&部署&金額がユニークになるなら3つのフィールドをまとめて主キーとします。 アクセスでもその方法が可能です。 伝票番号&部署&金額がユニークでない場合は、「主キーを設定しない」「ユニークとなるフィールドを捜して主キーとする」「ユニークキーとなるフィールドを独自に作る」のいづれかになります。

VKCTPHFIRW
質問者

お礼

>オートナンバー型というのはアクセス独特の型なので、 他のデータベースとの互換性を考えるならあまりお勧めできません。 そうなのですか、知りませんでした。 なるべくオートナンバー型は使わないようにします。ありがとうございました。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> オートナンバー型だと空きができてしまいます。 何に困るのですか? 空きが出来ても問題無いでしょう。OrderByで作成順にできるし。 > テーブルのレコードは削除したりする事もあるので どうしてもイヤなら、「削除フラグ列」設けて論理削除方式にするとか。

VKCTPHFIRW
質問者

お礼

空き番号があると、なんだかソワソワしてしまうんですw 冷静に考えてみれば確かに困りはしないですね。 ありがとうございました。

関連するQ&A

  • Access2003 データ型 オートナンバーについて エクセルからテ

    Access2003 データ型 オートナンバーについて エクセルからテーブルをインポートする方法 主キーである、IDと名をつけたフィールドのデータ型は"オートナンバー"でレコード新規入力際、自動で番号がふられていくようにしています。 このテーブルにエクセルのレコードをインポートして追加したいのですが、インポートできません。 ※オートナンバーフィールドが原因と思われます。 どうすれば、エクセルからこのテーブルにレコードをインポートし、追加されたレコードにオートナンバーで番号を割り振る事が出来ますででしょうか? 最も、シンプルな方法をお教え願います。

  • オートナンバー型はフィルタはかけられないのですか?

    ●テーブル1 フィールド1/テキスト型(主キー) フィールド1 20130128ダイエー ●テーブル2 ID/オートナンバー型(主キー) テーブル1の主キー/テキスト型 内容/テキスト型 ID   テーブル1の主キー   内容 1   20130128ダイエー   牛乳 2   20130128ダイエー   鶏肉 ●クエリ1 SELECT テーブル1.*, テーブル2.* FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.フィールド1 = テーブル2.テーブル1の主キー; ●フォーム1 そのなかにクエリ1に紐づいたサブフォームを設置(データシートビュー) フォーム1にコンボボックスを設置して、 Private Sub コンボ1_AfterUpdate() With Me.Controls("クエリ1").Form .Filter = "ID = '" & Me.コンボ1.Value & "'" .FilterOn = True End With End Sub このような構成なのですが フィルタを掛けようとすると、 実行時エラーで 抽出条件でデータ型が一致しません。(エラー 3464) となってしまいます。 これはフィルタを掛けようとしているデータ型がオートナンバー型だからでしょうか?

  • ACCESS2000のオートナンバー型について

    OSはWIN98です。ACCESS2000です。 ACCESS2000にてテーブルの主キーのフィールド(追番)に オートナンバー型を設定しました。 テーブルにデータを仮に100書きこんだとします。 その後に、その100個のデータを削除します。 そして、削除された後の最初のレコードにデータを 書きこもうとすると追番のフィールドが "101" に なってしまいます。新たに書きこむ時に追番を "1" にすることはできないでしょうか? 皆様よろしくお願いします。

  • Accessの主キーについて

    お願いいたします。 Accessの主キー設定について教えてください。 主キーの役割は、テーブルの中のレコードを区別 するための機能だと思いますが、 フィールドのデータ型をオートナンバー型にして おけば主キーの設定は必要ないのではないでしょう か? 主キーを設定する理由としては、参照整合性のため に行うという考え方で良いでしょうか? また、複数の主キーを設定するという場合のテーブ ル構成はどのような場合のシステムなのでしょうか? どうぞ教えてください。

  • access2007のオートナンバーについて

    access2007のオートナンバーについて こんにちは、さっそくですが質問させていただきます。 accessの勉強を始めた者ですが、 オートナンバーを指定したフィールドと、その他の必要な項目の フィールドから成るテーブルを作成して、 オートナンバー1~3までのレコードを入力して、 オートナンバー3のレコードを削除した時、 そのあとで、レコードを追加すると、 オートナンバー4のレコードが作成されるのですが、 このレコードをオートナンバー3のレコードとして、 作成することはできるのでしょうか? そのような設定ができろのかどうか、もしできるのであれば、 その方法や、参考になるサイトなど、なにぶん初心者ですので 教えていただけないでしょうか。 よろしくお願いします。

  • Access2003 他の項目と連携したオートナンバー(A001 C0

    Access2003 他の項目と連携したオートナンバー(A001 C001 C002 といった文字列)を生成したいです。 【使用ソフト】 Microsoft Office Access 2003 【目的】 マスターテーブルの≪一連番号≫の項目に「部署CD」+「000(オートナンバー)」という文字列を生成したい。 例:A001 C001 C002 といった文字列 【状況】 「部署テーブル」 部署CDを主キーとし、アルファベットにそれぞれ部署名が割り振られている ≪部署CD(主キー)≫ ≪部署名≫   A       生産部   B       品質管理部   C       営業部 「部署クエリ」 部署テーブルの部署名を抜き出している ≪部署名≫ 生産部 品質管理部 営業部 「マスターテーブル」 ≪一連番号≫ ※今回目的としている他の項目と連携したオートナンバー※ ≪所属部署≫ 部署クエリをソースとしてリストボックスで一点選択する(生産部・品質管理部・営業部からいずれかを選択) 【結果(実行例)】 1つ目のレコード:≪所属部署≫項目でリストボックスから生産部を選択する →マスターテーブル>1つ目のレコードの≪一連番号≫に「A001」が自動的に生成される 2つ目のレコード:≪所属部署≫項目でリストボックスから営業部を選択する →マスターテーブル>2つ目のレコードの≪一連番号≫に「C001」が自動的に生成される 3つ目のレコード:≪所属部署≫項目でリストボックスから生産部を選択する →マスターテーブル>3つ目のレコードの≪一連番号≫に「A002」が自動的に生成される 4つ目のレコード:≪所属部署≫項目でリストボックスから生産部を選択する →マスターテーブル>3つ目のレコードの≪一連番号≫に「A003」が自動的に生成される 5つ目のレコード:≪所属部署≫項目でリストボックスから品質管理部を選択する →マスターテーブル>2つ目のレコードの≪一連番号≫に「B001」が自動的に生成される 6つ目のレコード:≪所属部署≫項目でリストボックスから営業部を選択する →マスターテーブル>2つ目のレコードの≪一連番号≫に「C002」が自動的に生成される といったことを行いたいです。よろしくお願いします。

  • Accessでのエラー

    Access修行中の身で、勉強をかねて書類BOXのデータベースを作成中です。 親テーブルのフィールド  ID(主キー、オートナンバー)、タイトル名、・・・・・、保存箱ID 子テーブルのフィールド  保存箱ID(主キー、オートナンバー)、保存箱名、・・・・ リレーション  親:保存箱ID-子:保存箱ID という構成です。 クエリで以下のような複合テーブルを作成し、 複合テーブルのフィールド  ID(主キー、オートナンバー)、タイトル名、・・・、保存箱名、・・・・ データを入力しようとすると、「レコードを追加できません。テーブルの結合キーがレコードセットにありません。」というエラーがでます。また、保存箱IDに入力のないレコードは、抽出されません。 どのようにしたいかというと、保存箱IDは入力しなくてもいいフィールド(関連させなくてもよいデータ)にしたく、複合テーブルで保存箱名を入れると、子テーブルに新たにレコードが追加されるようにしたいです。 できれば、SQLを使用せずに解決したいと甘えておりますが、無理でしょうか。

  • ACCESS2000でオートナンバーを1から付けたいのですが

    ACCESS2000のテーブルで新規に作ったときはオートナンバーフィールドが1からになるんですが、何度かレコードの試験入力や削除を繰り返しているうちに、頭の番号が増えていきます。テーブルのデザインで、オートナンバーをテキスト型にして、新しいオートナンバー型行を挿入しても1からになりません。なにかよい方法はないでしょうか?

  • 主キーの変更

    次のようなテーブルが存在します。レコードはあくまで参考の値です。主キーについては必ず一意の値になるようにしています。 代理店sample1がIDを紛失し、再発行を依頼された場合や,その下の顧客店やこきゃくがIDを紛失し、再発行をする場合に既存のデータをそのまま保持したまま主キーだけを変更して関連された他のテーブルに一斉に反映させるにはどうすればよいでしょうか? ここには記載していませんが顧客店IDやこきゃくIDに関連する別テーブルが10ほど存在します。 主キーが存在するレコードと重複していないかをまずチェックしてそこから基礎となるテーブルに書き換えを行いと考えているのですが、思考がそこで止まってしまっています。 よろしければアドバイスをよろしくお願いいたします。 代理店テーブル |代理店ID(主キー) |代理店名| |        aaaaa | sample1| |        bbbbb | sample2| 顧客店テーブル |代理店ID(主キー) |顧客店ID(主キー)|顧客店名| |        aaaaa |      a-00001| ○○1店| |        aaaaa |      a-00002| ○○2店| |        bbbbb |      b-00001| △△1店| |        bbbbb |      b-00002| △△2店| 顧客テーブル |顧客店ID(主キー) |      こきゃくID(主キー)| こきゃく名| |        a-00001|    a-20071015-00001| Aさん   | |        a-00002|    a-20071015-00002| Bさん   | |         b-00001|     b-20050915-00001| Cさん   | |        b-00002|    b-20050915-00002| Dさん   |

  • Accessのオートナンバーについて

    いつもお世話になります。 Access2002を勉強中の初心者です。 オートナンバーのフィールドを持つテーブルを使用していますが、オートナンバーの最大値はいくつなんでしょうか? また、レコードがその最大値を超えた場合はどうなるのでしょうか? (1に戻るのでしょうか? それともエラーになるのでしょうか?) よろしくお願いします。

専門家に質問してみよう