• ベストアンサー

親子関係のテーブルについて

現在SQLServerを使用した、Webアプリケーションの製作を行なっています。 そのデータベース内で、親子関係があるテーブルを使用しており、親テーブルの主キーIDを、子テーブルの外部キーに設定しています。 親テーブルの主キーIDはidentityを使用して連番にしています。 親子関係があるテーブルは、親が登録されると、すぐに子のテーブルにもデータを追加するという形で、親テーブルが追加された直後に親テーブルの主キーIDをMAX関数を使用して取得し、子テーブルに登録しております。 このやり方ですと、通常は問題は無いのですが、同時に連続してアクセスがある時に、親テーブルの主キーIDを取得する際に、ずれが生じたりして正確な親子関係にならない場合があります。 この手法は一般的な手法ではないのでしょうか?また、何かいい対処法はございませんでしょうか? お力をお貸しください。よろしくお願いします。

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

SCOPE_IDENTITY()

参考URL:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=21176&forum=7&start=0

その他の回答 (1)

  • E-HR33
  • ベストアンサー率25% (20/78)
回答No.1

あまりたいしたコメントは出来ませんが参考程度に。 理解済とは思いますが、ms-06fsさんの手法ですとデータの整合性が保証できません。 親テーブルに登録したときのID=子テーブルに登録したときのIDが100%保証できないからです。 同時アクセスの可能性があるアプリケーションでは親テーブルに登録する際の主キーIDをアプリ側でコントロールしたほうがいいかと思います。 (1)親テーブルに登録する前にMAX関数にて親テーブルの最後のIDを取得。 (2)それをアプリ内でコントロールし、親テーブルに登録&子テーブルに登録。 こんな感じでいかがでしょうか?

関連するQ&A

  • 親子関係があるテーブルでの抽出

    教えてください。 ASPでMDBを検索したいのですが、 SQLにどうかけばいいのか悩んでします。 テーブルAがあります。 ID、名前、住所、親IDというフィールドがあります。 実は親子関係がこのテーブルには含まれていまして、 子データには、親IDに親データのIDが入っています。 子データにも名前、住所が入っています。 親データの親IDには0が入っています。 このテーブルAの名前・住所・子データの名前・子データの住所で 文字検索したいのですがどのようなSQLになりますか? 子データは、ないものもあります。 以上よろしくおねがいします。

  • 親子関係があるテーブル内での検索

    親のidを保持するテーブルです。 CREATE TABLE `tbl` ( `id` int PRIMARY KEY, `parent_id` int, FOREIGN KEY(`parent_id`) REFERENCES `tbl`(`id`) ) ENGINE=InnoDB; このテーブルで「parent_idがNULLで、かつ、子を持たない(親というか子でもないというか)行」 を検索したいのですが、どのようなSQLを記述すれば良いのでしょうか?

    • ベストアンサー
    • MySQL
  • 親子関係のテーブルを取得して多次元配列化するには

    お世話になります。 基本的な質問かもしれませんが、教えて頂けますとうれしいです。 PHP Version 5.4.14 MySQL 5.5.27 の環境です。 MySQLでたとえば以下のようなテーブルを3種類用意したとします。 ●group gr_id | gr_name | gr_status 1 | 野菜 | 1 2 | 果物 | 1 3 | 穀物 | 0 ●product pr_id | pr_name | pr_gr_id | 1 | 大根 | 1 | 2 | キャベツ | 1 | 3 | にんじん | 1 | 4 | イチゴ | 2 | 5 | 米 | 3 | ●picture pc_id | pic_file | pc_pr_id | 1 | 1.jpg | 1 | 2 | 5.jpg | 1 | 3 | 10.jpg | 1 | 4 | 100.jpg | 2 | 5 | aiueo.jpg | 2 | 6 | kakikuk.jpg | 3 | 6 | xxxxxxx.jpg | 4 | 6 | zzzzzzz.jpg | 5 | 各テーブルは (親)group[gr_id] = (子)product[pr_gr_id] (子)product[pr_id] = (孫)picture[pc_pr_id] の項目で、親、子、孫の関係になっています。 このとき、gr_status = 1 に該当する全データを、 3つのテーブルを連結した上で取得し、 「親テーブルの結果 => 子テーブルの結果 => 孫テーブルの結果」 という形で多次元配列化したいのですがどのようにすれば出来そうでしょうか? SQLでそのように取得する方法があるか、それとも 一度全データを取得した後、PHPで入れ子にする方法があるのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 親子に分けた方が良い? テーブルの正規化?

    ■知りたいこと ブログカテゴリー(親・子) を取り扱う際、普通は「1テーブル」でいくのでしょうか、それとも、親と子の2テーブルを作成するのでしょうか? ・それぞれのメリットデメリットは? ・「ケースバイケースによるので一概には言えない?」or「どちらでも同じ?」 ・また、「2テーブル(親子)」に分けることを正規化というのでしょうか? ■現状 ・1テーブルで運用(parent_idカラム利用) ・子カテゴリー数が多くなると、phpMyAdmin等で目視する際、カテゴリーテーブルから親カテゴリーIDを探しづらくなる(条件で抽出するので、大きな問題ではないですが)

    • ベストアンサー
    • MySQL
  • データベースのテーブル情報の取得

    VS2005(VB)/SQLServer2005で開発をしています。 プログラムよりテーブルの項目の情報(主キー等)を取得したいのですが、どのように取得するのでしょうか? よろしくお願いいたします。

  • マスターデータ(商品マスタ、担当者)の全項目を子テーブル(注文票テーブル)に登録するよい方法は?

    商品マスタ、担当者マスタがあります。 商品マスタの項目はたとえば次のようなものです。 product_id(主キー),size,color,price,.... 担当者マスタの項目はたとえば次のようなものです。 salesman_id(主キー),local_area,global_area,.... 注文票を登録するときに、注文票テーブルに商品(product)と担当者(salesman)を記録します。 このときに、product_id,とsalesman_id(主キー)を記録しますが、 注文票には、マスターの主キー以外のすべてのfieldも登録したいです。なぜなら、sizeやcolor、担当エリア(local_area,global_area)はしょっちゅう変わるからです。こんなことは、よくあることだと思いますが、、 たとえば、商品マスタのスペックがsize,color以外にも大量にある場合、注文された商品や担当者のIDを指定したときに、そのIDに加えてそれに付随するすべてのfieldのデータを注文票テーブルに登録(insert)するためのうまいMySQL構文なり、うまいPHPのプログラムの手法が知りたいです。よろしくお願いします。 一つ上の親テーブルならまだ何とかなりそうですが、2,3つ上の親テーブルのfieldをとってきて、注文票に登録するような方法は、さらに難しくて、こまってます。

  • 主キーが二つのテーブルのselect方法

    SQL文に関して質問します。 主キーが二つあるテーブルを作成したのですが。 [table_A] ID | SubID | Name 1 | 0 | pochi 1 | 1 | tama 2 | 0 | koma 3 | 0 | koro 3 | 1 | shiro 4 | 0 | buchu このテーブルから、IDが二つ以上あるものに関してはSubIDの大きいほうのレコードだけ取得して ID | SubID | Name 1 | 1 | tama 2 | 0 | koma 3 | 1 | shiro 4 | 0 | buchu という結果を出したのですが、select文が思いつきません。 副問い合わせも考えたのですが、うまくいきませんでした。 ちなみにRDBSはSQLServer2000を使用しています。 よろしくお願いします。

  • アクセスの更新クエリについて(親子テーブル)

    はじめまして。 アクセスを勉強しはじめて2週間の初心者です。 説明がわかりずらいかもしれませんが、ご容赦ください。 以下のようなテーブルがあります。 ●親テーブル(装置名称と装置番号の組み合わせが主キー) ・装置キー ・装置名称 ・装置番号 ・収容No-1 ・収容No-2 ●子テーブル(主キー設定なし) ・装置キー(親テーブルの装置キーと参照整合:1対多) ・収容No-3 ・最新情報 ●参照テーブル(主キー設定なし) ・収容No-1 ・収容No-2 ・収容No-3 ・最新情報 子テーブルの最新情報フィールドを参照テーブルの最新情報に 更新する更新クエリを作成したいのですが、うまく実行ができ ません。 クエリの作り方の基本がわかっていないと思いますが、私が作 った方法は、 1.上記3つのテーブルをクエリのデザインビューで表示 2.親テーブルと参照テーブルの収容No-1、2を結合 3.子テーブルと参照テーブルの収容No-3を結合 4.クエリの種類を更新クエリに変更 5.テーブルに子テーブル、フィールドに最新情報を設定 6.レコードの更新欄に[参照テーブル]![最新情報]を設定 です。 ビューで確認すると殆どのデータが空白で表示されております。 どのあたりに悪さがあるかをご教授いただけますと助かります。 ご不明な点がありましたら、何なりとお伝えください。 よろしくお願いします。

  • テーブルを再編集するには

    PostgreSQL7.1.3 RedHatLinux7.2 create table でtestというテーブルを作りまして、ID、nameというフィールドを作り、主キーをIDに設定しました。このテーブルにtelというフィールドを追加したいのですが、テーブルを編集するコマンドがわかりません。 また、testテーブルにいつくかデータを入力したのですが、そのデータがちゃんと入っているかどうか確認するコマンドも知りたいです。 宜しくお願いします!

  • 主キーの取得

    現在SQLServer2000を使用しています。 存在しているテーブルから主キーを取得したいのですが うまく行きません。 sysobjects,syscolumnsシステムテーブル辺りから 取得できそうでできないのでイライラしています。 どなたかご教授お願いいたします。