• 締切済み

主キーの変更

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

  • Oracle
  • 回答数2
  • ありがとう数7

みんなの回答

  • ese_ee
  • ベストアンサー率48% (68/139)
回答No.2

各IDは別途UNIQUEインデックスで一意性を確保し、 主キーはSEQUENCE等を使用して「他に意味を持たない値」にしたほうが、 扱いやすいかと思います。 主キーに主キー以外の意味を兼務させたり、 あとで変更が必要になるものを主キーにするのは避けるべきです。

ab-chan
質問者

補足

ご回答有難うございます。 まだまだ勉強足らずと言葉足らずで申し訳ないのですが、設計が上記の形で走ってしまっている場合は修正が可能でしょうか? 参考といたしまして、このような質問内容に類似したシステムの構築を行う際に参考となる文献やホームページをご存知でしたらお手数ではございますが教えていただけないでしょうか?

  • calltella
  • ベストアンサー率49% (317/635)
回答No.1

IDを再発行し、なおかつ顧客データを維持する場合は いずれにしても代理店sample1のIDを特定する必要がありますよね? ならば代理店sample1にIDを伝えた方が手っ取り早いと思うのですが 業務的にできないとなると各テーブルから代理店sample1の主キーを 新規のIDに書き換えるしかないですね。

ab-chan
質問者

お礼

ご回答有難うございます。参考にさせていただきます。

関連するQ&A

  • テーブルAにあって、テーブルBにないデータ抽出

    このようなデータのテーブルがあります。 テーブルA key ID ----------------- 1 AAAAA 2 BBBBB 3 CCCCC 4 DDDDD 5 EEEEE 6 FFFFF 7 GGGGG 8 HHHHH 9 IIIII テーブルB key ID ----------------- 1 AAAAA 2 CCCCC 3 EEEEE 4 FFFFF 5 HHHHH 6 IIIII 7 JJJJJ 8 KKKKK 9 LLLLL この場合テーブルAのIDの中で、テーブルBのIDには存在しない行を取り出すのに、プログラムを使わずに取得する方法はありますか? この例だと取得するはずの行は key ID ----------------- 2 BBBBB 4 DDDDD 7 GGGGG になります。 どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブル結合のSQL文について

    はじめまして、よろしくお願いします。 テーブルA、B、Cから情報を取得し、下記のSELECTイメージを表示させたいのですが、 どのようなSQLを記述すれば良いのかわからず、困っております。 どなたかご教示頂けますでしょうか。 SELECTイメージ  日付      キー  ------------ -------------  9/1      AAAAA  9/1      CCCCC  9/2      AAAAA  9/2      CCCCC  9/3      AAAAA  9/3      BBBBB  9/3      CCCCC  9/4      AAAAA  9/4      BBBBB  9/4      CCCCC テーブルA  日付      キー  ------------- -------------  8/31      AAAAA  8/31      CCCCC テーブルB  日付      キー  ------------ -------------  9/1      AAAAA  9/3      BBBBB  9/4      CCCCC テーブルC  日付  -------------   ・   ・   ・   8/31   9/1   9/2   9/3   9/4   9/5   9/6   ・   ・   ・

  • SQL の主キーについて

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

  • 主キーの値を自動更新することはできますか

    Accessで、あるテーブルの主キーとなる列から、一対多の関係で別のテーブルがあります。 テーブル1 主キー a01  あああ a02  いいい a03  ううう … テーブル2 主キー  b01   a01 かかか b02   a05 ききき b03  a01 くくく … こういうイメージなのですが、あとから「a01」等を、全部「g01」などのように変えて、なおかつテーブル2のデータを更新することはできるでしょうか。

  • 外部参照してるキーを主キーにすることは可能?

    DB設計について質問なんですが、テーブル1のA列を主キーとし、テーブル2のA列から外部キーでA列を参照したとします。 この時、テーブル2のA列を主キーとして設定することは可能なんでしょうか。 (テーブル2の方で列Aと列Bを組み合わせて主キーにしたいのです。要は二列でデータがユニークになるように設計したい) 使用しているDBはPostgreSQLです。 以上、宜しくお願い致します。

  • 主キーが文字型での結合

    主キーが文字列型のカラムhoge_idがあります。 (hoge_idは英数字8文字とします) hoge_idで、他のテーブルに結合します。 また、Webからアクセスする必要があり、URLのパラメータで、 ?hoge_id=A1B2C3D4 の様に、主キーを渡す必要もあります。 文字列を主キーにする方法に慣れていないせいか、気持ち悪く感じます。 主キーを別途serial型のカラムidを作成し、 hoge_idには、ユニークキーで設定をし、 結合や、URLのパラメータは主キーのidを使う方法はあまり意味がないでしょうか。 アドバイスを頂けませんでしょうか。 よろしくお願い致します。

  • 主キーを別のフィールドに変更したい

    Access2000のVBAで、既存のテーブル「M」の主キー「ID_1」を「ID_2」に変更したいのですが、可能でしょうか? アップデータのようなロジックを組まなくてはならないので、手順としては、、、 1)まだ「ID_1」が主キーであるかどうか判断する 2)1がTrueなら、「ID_2」が主キーに変更する 3)1がFalseなら、(「ID_2」が既に主キーであると見なし)特に何もせず終了 おそらく、indexオブジェクトあたりを使えばできると思うのですが、どうもこのあたりが複雑でわかりません。 どなたかご存知の方、ご教授いただけると幸いです。

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

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

  • 複数のテーブルに対して・・・

    過去に同様の質問があったかも知れませんが、Accessのバージョンがかなり古いので質問させて下さいね。 Access97(すみません、ホント古くて…)で、下のような顧客情報管理ファイルを作成しました。 テーブルA<→フォームA> ・顧客ID(主キー: テキスト型) ・氏名 ・情報A1, A2~ ・入力フォームB~への移動ボタン(同一IDレコードの表示) テーブルB<→フォームB> ・顧客ID(主キー: テキスト型) ・情報B1, B2~ テーブルC<→フォームC> ・顧客ID(主キー: テキスト型) ・情報C1, C2~ 最初からテーブルA~Cを結合したものを作ればよかったのですが、 それぞれのテーブルについて細かい入力項目が30~40個あるため、 分割して作成してしまいました(そして今後もテーブルは増える可能性大です)。 現在、テーブルAにだけ、20人分のデータが入っています。 今後も顧客数やテーブルが増える予定なのですが、 その都度テーブルごとに顧客IDをいれるのが面倒になってきました。 そこでお訊ねしたいのですが、テーブルA(を元にしたフォームA)に顧客IDを入れると、 テーブルBやCにも同じテキストが入力されるような設定は可能でしょうか。 最初、クエリーで連結しようとしたのですが、 既にテーブルAにいくつかデータが入っているせいか、どうも上手く反映されません。 単に私の参照方法が下手だったからかもしれませんが…。

  • 主キーレコードを削除する場合

    userテーブルのu_idを主キーとしており、 他でもu_idを主キーとしてあるテーブルがあります。 delete from user where u_id = 2  で、u_id = 2 のレコードを削除させようとしたのですが、 Cannot delete or update a parent row: a foreign key constraint fails (`aaaaa`.`message`, CONSTRAINT `message_ibfk_2` FOREIGN KEY (`m_guid`) REFERENCES `user` (`u_id`) ON UPDATE CASCADE) のようなエラーがでます。 どのような意味でしょうか?また、これを改善するには設定、sql文はどのようにしたらよいでしょうか? ご回答お願いいたします。