伝票データを各テーブル(ヘッダと明細)に分けたい格納したいと考えています。
※ヘッダ情報と明細にヘッダNoというフィールドを作成してこの値で紐付けるようにしています。
そこで皆さんに質問があります。
ヘッダ情報を削除した際に紐づいている明細データも一緒に削除され、明細のみ削除する際はヘッダ情報は削除されずに明細のみが削除されるような仕組みにするにはどうしたらいいでしょうか。
またこういう機能ってういか、仕組みの事を何て言うんでしょうか。
※確かテーブルを作成する際に何か記述したらできたような記憶がするんですが・・・
間違っていたらすみません。
説明が下手ですみませんが理解していただけましたでしょうか。
申し訳ありませんがアドバイス宜しくお願いします。
No.2ベストアンサー
- 回答日時:
もともと親子関係においては
(1)子は親の値しか使用できない。
(2)親は子が存在する間は削除できない。
(3)親は子が存在する間は変更できない。
というルールなのです。
だから、ON DELETE とかON UPDATE は
オマケみたいなもので、本来は無いと
考えるべきです。
DELETEはキー整合をとりますが、
TRUNCATEは何も考えずバッサリ
なので、処理速度は断然有利です。
その代わりON DELETEが利かず、
不整合が生じる可能性があるため
外部キー参照のあるテーブルでは使用
できません。
外部キー参照は物理的に整合性を保つ
ためには便利ですし、親子結合で行う
クエリも高速です。但し、データの追加や
削除で、リレーションシップの更新を伴う
ため、こういう関係を持たないテーブルの
追加/更新より時間がかかるという欠点も
あります。
かつて、CPUの性能が悪く、DBが遅い
時代にはリレーションの設計は大事な
要素でした。しかし、何時の頃からか
リレーションは廃れてしまい、今は取り
入れない方が普通になりました。
レコード数が大量で親子関係の参照機会が
多く、データの追加/変更/削除の頻度が
低い場合は外部キー参照は有効です。
それ以外では物理的な関係は持たない方が
よいでしょう。
返答が遅くなってすみません。
大変、勉強になりました。
リレーションを貼らない方向でやりたいと思います。
本当にありがとうございました。
No.3
- 回答日時:
アプリケーションの詳細がわからないので何とも言えないのですが、
販売管理等のアプリでは単純にデータを削除しないほうがいいです。
削除すると経緯が全く分からなくなるので、
マイナスの売上をたてる、もしくは、削除フラグを立てるといった処理の方が賢明です。
No.1
- 回答日時:
「外部キー制約」という方法を使います。
ヘッダの定義
CREATE TABLE HEADER (
HEADER_NO VARCHAR(4) PRIMARY KEY,
~);
明細の定義
CREATE TABLE DETAIL (
HEADER_NO VARCHAR(4)
REFERENCES HEADER(HEADER_NO)
ON DELETE CASCADE
~);
http://www.postgresql.jp/document/9.1/html/ddl-c …
この回答への補足
返事がおそくなってすみません。
nda23さんのアドバイス通りテーブルを作成して、各テーブル(HEADER、DETAIL)にレコードを追加、そしてHEADERテーブルのレコードを削除したらDETAILのレコードも一緒に削除する事ができました。
ありがとうございました。
外部キーを指定したテーブルに「TRUNCATE TABLE」を実行したらエラーが出力されました。
調べたら外部キーを指定したテーブルには「TRUNCATE TABLE」が使えない事を知りました。
・cannot truncate a table referenced in a foreign key constraint
もう少し私にお付き合いしていただけませんでしょうか。
外部キーを指定する方法と各テーブル(HEADER、DETAIL)に対してDELETEを実行する方法ではどちらが適切なのでしょうか。
私の勉強不足で申し訳ありませんが再度、アドバイスいただけませんでしょうか。
宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- 財務・会計・経理 個人情報と税務・会計について 1 2022/04/12 03:39
- その他(コンピューター・テクノロジー) 「プロトコル」の定義について 5 2023/04/16 13:13
- その他(クラウドサービス・オンラインストレージ) 個人情報保護の件 1 2023/05/18 12:19
- PDF 2つのPDFを重ねる方法はありますか? 4 2023/01/30 14:04
- 戦争・テロ・デモ 公安がアゾフをテロ組織から解除したのって、米国がウクライナへ多額の支援する前でしたっけ? 2 2022/06/21 20:30
- Excel(エクセル) VBA でvlookup エラーなどは削除したい 8 2022/12/30 04:03
- 教えて!goo なんで同じ質問を繰り返す人の質問に「指摘」すると削除されるのですか? 5 2023/06/08 20:37
- オンラインゲーム epicのアカウントからgoogleを削除すると 1 2022/12/21 19:39
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/6】 西暦2100年、小学生のなりたい職業ランキング
- ・ちょっと先の未来クイズ第5問
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
列のDEFAULT設定を削除するコマ...
-
Excel テーブル内の空白行の削除
-
HiRDBのPURGEとDROPの違い
-
条件付DELEATE文について
-
アクセス通貨型or数値型について
-
Access2003 VBAのDELETEについて
-
L2SWはARPテーブルを持っている?
-
テーブル名をカラムとして取得...
-
ROWNUMでUPDATEをしたいのです...
-
SQL*LoaderでCSVから指定した列...
-
SQL、2つのテーブルで条件一致...
-
SELECT 文の NULL列は?
-
Accessでデータシートに同じデ...
-
sqlplusで表示が変なので、出力...
-
会社の飲み会の幹事になり、座...
-
一つ前に戻るには…
-
update文で改行を入れる
-
SQL 複数テーブルのupdate
-
外部キーだけのテーブル(主キ...
-
まるいテーブル 円い 丸い 漢字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel テーブル内の空白行の削除
-
アクセスのクエリでレコード削...
-
トリガって、自分自身のテーブ...
-
HiRDBのPURGEとDROPの違い
-
アクセス2010について
-
ACCESSのマクロでテーブルのデ...
-
CSVファイルから一括して削除す...
-
Access2000の削除クエリで消し...
-
テーブルデータの削除による対応策
-
mysqlで間接クエリー実行させた...
-
Accessのテーブルをすべて削除
-
アクセス通貨型or数値型について
-
削除フラグってどうなんでしょう?
-
リレーションについて
-
ワークテーブルなのに自動で削...
-
列のDEFAULT設定を削除するコマ...
-
MySQLのストアドでファイルを削除
-
MySQLを勉強中ですが、作業の内...
-
レコードの削除で delete from ...
-
物理削除と論理削除、どっちが...
おすすめ情報