• ベストアンサー

主キーの変更

OracleBronzeのSQL基礎の本に 「一般的に主キーの値は変更できない。」 とあるのですがこの一般的にというのは子レコードが存在する場合でしょうか? 子レコードを持たない主キーをUpdate文で更新してみましたが、すんなり更新できたのですが・・・

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

  • ベストアンサー
  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.2

主キー(プライマリ・キー)自体の制約は以下です。 ・1テーブル内でユニーク(一意)を保証する。 ・Nullを許容しない(NotNull)。 ですので、主キー自体の値は物理的には更新可能です。 ただし、例えば以下のような場合に製品テーブルの主キーが 更新された場合どうなるでしょうか。 ・製品テーブル(マスタ)  製品コードが「A1」※主キー  名称が「ねじA」 ・在庫テーブル  製品コードが「A1」※主キー  在庫数が100個 製品テーブルに該当するコードがなくなるので、在庫テーブル側からは名称がわからなくなります。リレーショナルが失われるので、製品テーブル側からは在庫数がわからなくなります。 ですので、通常、主キーの更新は行ないません。 しかし、現実世界では様々な統廃合が行なわれるので主キーを更新せざるを得ない場合もあります。その場合は、各テーブルの関係を考慮に入れて、関係するテーブルすべてのキーを更新する必要があります。 子テーブルにレコードがあった場合、親テーブルのレコードが削除できないのは外部キー(フォーリン・キー)です。 この場合は、子テーブルにデータがある限り、親テーブルからは、参照しているレコードを削除することはできません。

kei2543
質問者

お礼

丁寧に説明して下さりありがとうございます!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

Bronzeの本を探し出してみてみましたが、これは「リレーショナルデータベースの用語」のところに書いてあるんですね。 そうしてみると、質問者さんの理解でもいいかもしれませんが、「リレーショナルデータベースでは、一般的に主キーの値は変更されないことを前提にデザインされる」という意味で理解された方がよいと思います。

kei2543
質問者

お礼

リレーショナルデータベースの考え方なんですね ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 主キーの変更

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

    調査データの集計、蓄積用のDBを制作しております。 制作しているDBは主キーに県コードが含まれています。 そのため、調査データの住所に変更があるとコードを変えなければなりません。 AccessでのDBはほぼ完成しており、今からコードの形態を変更することは避けたいです。(もともと古い独自のDBのデータを流用しています。) 現在、主キーに県コードが含まれていますが、それとは別に県コードフィールドを設けています。 ※コードの形態 (先頭の二桁又は一桁が県コード、コードは4桁又は5桁) 例   主キー 北海道 1001 東京  13199 沖縄  47001 新規のデータを入力する際に主キーを入力しているのですが VBAの知識がないので県コードは個別に入力しています。 住所が変わり県が変更になった場合主キーを変更する必要が あるのですが一対多でリレーションシップをいくつもしてあり サブフォームなども使用してます。 主のフォームで主キーを変更した場合、関連付けられたレコードの主キーも変更されるようにしたいのですが可能でしょうか?

  • 10レコード目の主キーの値を取得したい場合

    Debug.Print Me.Form.CurrentRecord これで現在のレコードが取得でき、 Debug.Print Me.Form("主キー").Value これで現在のレコードの主キーの値が取得できるのですが、 例えば、10レコード目の主キーの値を取得したい場合は、 どのようなコードになるのでしょうか? よろしくお願いします。

  • 主キーの飛び番について

    お尋ねします。レコードの追加削除を繰り返すと、次に追加する際に主キーIDが飛び番になってしまう。ID:1,2,4,6,7 などになりますが、次回、追加する際、飛び番を埋めるIDを 自動で探し出すsql文などあるのでしょうか? for文などで自分で飛び番を探すしかないのでしょうか?

  • ON DUPLICATE KEY UPDATE

    こんにちは。 PHP + MYSQL でシステム構築をしております。 この度は、新しいレコードを INSERT するが、もしもINSERT するレコードのうちの主キーが既に存在する場合は、UPDATE を行うという処理をしたいと思っています。 調べているうちに MySQL 4.1.0 の新機能である ON DUPLICATE KEY UPDATE 節というものがありましたが、4.1.0以前の MYSQL を利用の場合はどのようにするのが最適でしょうか? 私が考えたのは、挿入前に主キーを持つレコードを読み込んで、レコードが返ってこなかった場合は INSERT、何かレコードが返ってきた場合は UPDATE というようにする方法ですが、少し回りくどい気もします。 クエリのみで、またはシンプルな方法でこれを解決する方法はありますでしょうか? ご教授お願いいたします。

    • 締切済み
    • PHP
  • 複数のフィールドを含む主キーに関して教えてください。

    SQLで、主キーが複数のフィールドを含む場合、    PRIMARY KEY ( col1 , col2 ) 一般にどのようなインデックスが作成されるのでしょうか? またその結果を見れば分かるかも知れませんが、キーの順番は意味を持っているのでしょうか。 Mysqlに限定されてもかまいません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Accessの主キーについて

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

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

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

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

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

Amazonからの異常メールについて
このQ&Aのポイント
  • アマゾンから異常なアクティビティが検出されたメールが届いた場合、注文とアカウントが停止されている可能性があります。
  • 本メールに記載されている注文番号とIPアドレスを確認し、グーグルで調査することをおすすめします。
  • このようなメールはフィッシングメールの可能性もあるため、注意が必要です。
回答を見る