• ベストアンサー

SQL の主キーについて

次のページで・・・ https://rfs.jp/sb/sql/s03/03_3.html "各テーブル間のリレーション"というところに図がありますが、商品テーブル、顧客テーブルの商品ID、顧客IDはそれぞれ主キーである必要はあるのでしょうか? ユニークであることは前提ですが。 Access, SQL Serverで考えています。

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

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (740/5642)
回答No.3

システムの設計によって考え方は違ってくると思います。 商品IDや顧客IDは人間が目で見ることがあるのか否か。 そのIDが変更されることがあるのか否か。 変更された際にリレーションを破棄してもいいのか否か。 削除されたIDを別データとして再利用させてもいいのか否か。 リレーショナルデータベースの理想の姿としては、こうあるべきとか、こうあってはいけないとかあると思うので、それに対しての正解はあるかも知れません。 ですがシステムへの要望によっては理想の姿とはちょっとだけずれたりすることもあると思います。それはシステム設計者の問題なのかも知れないこともあるでしょうし。 何を主キーとするかはそんなこんなで決まるとして、JOINする項目として使うものが主キーであるべきかについては、主キーでなくても構わないですがインデックスであった方がいいと、私は思います。 ユニーク指定で自動的にインデックスとして扱われるデータベースもあるのかも知れませんが、ユニークとインデックスが別々の概念であるとするなら、インデックスであった方が検索(探索、走査)が早くなるはずなので、このパフォーマンスのためにインデックスにした方がいいと考えます。 データベースのアルゴリズムがどのようなものかによって違ってくるのかも知れませんが、SQL Serverではユニーク(制約)とインデックスは別々のものなのでそんな風に私は思っています。

ebaeba2
質問者

お礼

主キーに対する、考え方がわかりました。 とりあえず、JOINは主キーでなくてもよさそうなので現状変更なしで進めたいと思っております。 JOINに使う項目ですのでいったん、設定されれば更新、削除されることはありません。 ありがとうございました。

その他の回答 (2)

回答No.2

すみません、言い方を間違えました。 >>主キーは1つで充分です ではなく、主キーは1つでないといけません。 また、そのレコードのその他のフィールドの中身が 全く同じであっても、主キーが違えば別のレコードです。 失礼しました。

回答No.1

主キーは1つで充分です。 他のテーブルから参照される際に、レコード全体で重複する値がなければよいのです。 それが不可能なら「正規化されていない」だけのことです。 また、他のテーブルをそれより他のテーブルが参照する際も、 共通の主キーを使用するように、設計するべきです。 難しい場合も参照元の「新」主キーは一意でなければなりません。

ebaeba2
質問者

補足

ご回答ありがとうございます。 例のテーブルを元に追加説明させていただきますと、別にIDカラムがあってオートナンバーで主キーになっています。そして商品ID、顧客IDカラムがあって値は採番テーブルを元に取得していて値はユニークです。 ただ、JOINする際に後者の主キーでない方を採っています。 JOINする場合、照合元は主キーである必要があるのかな?って思いまして。 よろしくお願いいたします。

関連するQ&A

  • 主キー、インデックスが作成できない

    お世話になります。 SQLserver2000とACCESS(フロント)で使っております。 主キーもインデックスも設定していなかったテーブルに エンタープライズマネージャから主キーを設定しようとしたのですが、保存しようとすると以下のエラーが出てしまいます。 もともと更新クエリを作成したのですが、”更新可能なクエリであることが必要です。”とエラーが出てしまい、いろいろ調べるうちに主キーを設定していないから??と思い、設定しようとしたのですがうまくいきません。。宜しくお願いします。 ■エラー内容 テーブル 'テーブル名 (ユーザー名)' - インデックス 'インデックス名' を作成できません。 ODBC エラー : [Microsoft][ODBC SQL Server Driver][SQL Server]インデックス ID 1 で重複したキーが見つかったので、CREATE UNIQUE INDEX は終了しました。もっとも重要な主キーは 'XXXX-00XXXX-00-A1 ' です。 [Microsoft][ODBC SQL Server Driver][SQL Server]制約を作成できませんでした。以前のエラーを調べてください。 [Microsoft][ODBC SQL Server Driver][SQL Server]ステートメントは終了されました。

  • テーブルに主キーを作らないデメリットは?

    アクセスのテーブルを作るにおいて 主キーのフィールドを作らなかった場合、 どのようなデメリットや不都合がありますか? 既にいくつか主キーのないテーブルを作ってしまいました。 このまま運用しようか主キーを作るべきか悩んでいます。 SQLサーバーに移行する場合などにエラーになるのでしょうか?

  • 主キーの変更

    次のようなテーブルが存在します。レコードはあくまで参考の値です。主キーについては必ず一意の値になるようにしています。 代理店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+SQL Serverで主キーを自動採番する

    ACCESS+SQL Serverで主キーを自動採番する ACCESSを独学で勉強を開始しているものです。 顧客管理のようなものを作りたいと思っているのですが、 オートナンバーではない主キー(顧客コード)を設定しているテーブルがあります。 顧客コードの構成はアルファベット1文字+数字8桁です。 そのうち、数字は西暦2桁+月2桁+日2桁+下2桁は連番です。 ACCESS2007プロジェクトで、SQL Server 2005 Express Editionへ接続しテーブルは作ってあり、既に顧客データが10件ほど入っています。 新規に顧客データを追加する際に、必要事項を入力し、登録ボタンを押した段階で顧客コードを自動生成し、重複チェックし、採番したいと考えています。 アルファベットは必要事項入力時に入力済み、日付もその日の日付を6桁設定し、とりあえず「01」と下2桁を採番して、現在のデータに同じものがないかチェックします。 そして、同じものがあれば「01」+1を繰り返しながらチェックしていくというようなコードはどのようにすればいいでしょうか? わかりづらいとは思いますが、よろしくお願いします。

  •  テーブルA(主キー有り)とテーブルB(主キー有り)をLEFT OUT

     テーブルA(主キー有り)とテーブルB(主キー有り)をLEFT OUTER JOINで外部結合したテーブルが 読み取り専用になっていて、データの更新ができないのですが、更新出来る方法が解らずに、困っていま す。この結合したテーブルのデータを更新できるようにするにはどのようにすればよいのでしょうか、お助け 願います。 SQL SERVER 2008 EXEPRESS EDITION をインストールしたPCからSQL 2000 serverのデータベースに アクセスしています。

  • 主キーが2つ

    私はアクセス97を仕事に活用したいと思い、勉強している初心者です。そこで質問なのですが、あるアクセスのホームページで参考にしているテーブルに主キーが2つあります。しかし、普通に主キーを設定しようとしても、1つしか設定できません。どうすれば1つのテーブルに2つ主キーを設定することができますか?よろしくお願いします。

  • 未定義になるのは主キーじゃないのが原因?

    二つのテーブルを一対多のリレーションシップで繋ぐとき、 一になる方は主キーじゃないと、一対多にならなかったり参照整合性はできないのでしょうか? 主キーではないテーブル1のフィールド(一)と、(多)のテーブル2のフィールドでリレーションを組もうと思ってるのですが、 リレーションシップの種類が未定義になってしまいます。 これは、1になる方のテーブル1が主キーじゃないのが原因なのでしょうか? テーブル1のこのフィールドは、重複することはありませんが、空白も入る為、主キーにできないし、 主キーはほかのフィールドで使っています。

  • 外部から取り込んだテーブルに主キーを設定するには

    外部から取り込んだテーブルに主キーを設定するには sql server 2000 のデータベースにsqlserver 2008 express editionをインストールしたPCで別のデータベースのテーブルをインポートウィザードにて取り込み、そのテーブルに主キーを設定しようと、新しいログイン名で-ログイン-セキュリティ-ユーザー-プロパティの画面でセキュリティ保護可能なリソースを選択し、オブジェクトの列の権限にて更新、選択、等許可に設定しても、テーブルの変更が(主キーの設定)ができません。 この変更は、もともと無理なことなのでしょうか。そうだとしたら他にテーブルの列設定を変更する方法はないのでしょうか どうかご教授お願いします。宜しくお願いします。 PC os XP pro (sql server 2008 express edition) サーバー WINDOWS 2000 server SQL server 2000

  • ER図の外部キー

    はじめまして ER図の書き方でFK(外部キー)として記載できるもしくは そう呼べるのはinnodbでの環境に限るのでしょうか? mysqlでmyisamにて構築しているのですが 例えば注文テーブルに商品IDや顧客ID、受注スタッフID、発注スタッフID等の カラムがあったとして、そらぞれのカラムは商品テーブル、顧客テーブル、 スタッフテーブルのプライマリーキーです。 この場合、商品IDは外部キーと呼べるのでしょうか。 また発注スタッフIDが必ず登録されているとは限らないのですがこれも外部キー と呼べるのでしょうか。 よろしくお願いします

    • ベストアンサー
    • MySQL
  • SQLについて

    こんばんは。 SQLについて質問です。 STUDENTテーブル student_id name birth -------------------------------- 1000 AAAA 19800101 1003 BBBB 19801102 1010 CCCC 19810101 このようなテーブルがあるときに、 主キーのstudent_idのあいてる番号が知りたい場合は どのようなSQLにすればよいのでしょうか? 1000から1020で空いてる番号を検索するような SQLを教えてください! 色々と試してみたのですが、よくわからなくて。。。 すみませんがよろしくお願いいたします。