更新履歴の扱いについて

このQ&Aのポイント
  • 個人や企業のマスタ情報を保持するTABLEが更新された場合、旧情報を保持する方法に悩んでいます。
  • 一つの方法として、更新されるTABLEには主キーを設定し、旧情報を別のTABLEに保存することが考えられます。
  • または、更新されるTABLEには日付のカラムを追加し、旧情報をINSERTすることで履歴を管理することもできます。
回答を見る
  • ベストアンサー

更新履歴などの扱いについて

仮に個人や企業などのマスタ情報を保持しているTABLEがあったとしてそのTABLEがUPDATAされた場合、旧情報は旧情報としてとっておきたいのですが、その場合のTABLEのありかたや主キーの設定の仕方に悩んでいます。 考えつく方法としてはTABLE Aに"管理CD" "ID" "PASS"として管理する側は管理IDを主キーに管理していき、ユーザにはIDとPASSは自由に変更できるようにしたいのですが、その場合旧情報をTABLE AにINSERTしたら管理CDの重複でできないので、TABLE Bを用意して主キーは設定せず、"日付"のカラムを追加して旧データはどんどん更新されるたびにINSERTされるようにすればいいのかなと思っています。 多くの方はどのような考えかたでこのような履歴管理をされていらっしゃるのでしょうか?

  • MySQL
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
回答No.1

文章だけでだらだらと書かれると、分かりにくいのですが。。。 MySQLのバージョンは何ですか? トリガを使えるバージョンなら、トリガの使用を検討してみてください。 管理CDが重複云々と書かれていますが、管理CD+世代通番で主キーにするといった方法もあります。

関連するQ&A

  • マスターのあるレコードを削除しても(修正)

    【Access 2013 vba】 テーブルのあるレコードを削除しても、そのIDを使用している別テーブルには影響を与えたくない場合、つまり、別テーブルのIDの値は消したくない場合には、どのようなリレーションシップにしたらよいでしょうか。 因みに、このテーブルの編集画面フォームAでは、3つのクエリーを作成しその最後のクエリーQ3をレコードセットとして参照しています。 以下参照 【Table1】  ・受注ID(主キー)  ・日時  ・部屋ID(Ex.Key) 【Table2】  ・部屋ID(主キー)  ・建物ID(Ex.Key)  ・部屋の情報 【Table3】  ・建物ID(主キー)  ・建物の情報  ・所有者ID(Ex.Key) 【Table4】  ・所有者ID(主キー)  ・所有者の名前 <<Q1>>→Table1+Table2  <Table1>   ・受注ID   ・部屋ID2(外部キー)→Table2部屋の部屋ID ⇐ ※ ここが、問題のリレーションシップです。  <Table2>   ・部屋ID...主キー <<Q2>>→Q1+Table3  <Q1>   ・Q1のTable2の建物ID(外部キー)→Table3の建物ID  <Table3>   ・建物ID <<Q3>>→Q2+Table4  <Q2>   ・Q2のTable3の所有者ID(外部キー)→Table4の所有者ID  <Table4>   ・所有者ID このようにクエリーを作成し、Q3をフォームのレコードソースとしたフォームAを使用しています。 このフォームで、<<Q1>>の※印の行のTable2から取得するIDをTable1の項目「部屋ID2」に保存していますがTable2の方にあるレコードを削除しそのIDがなくなっても、Table1には影響しないようにしたいのです。 よろしくお願いします。

  • 効率のよい方法があったらお教え下さい

    下記の仕様を元にAccessでプログラムを組もうと考えています。 「プログラムをするにあたっての方法」のように組もうと考えているのですが、効率が悪いように何となく感じています。 もし、こういった方法でプログラムしたらという方法がありましたらお教え下さい。 ------------------------------------------------------- 仕様 ------------------------------------------------------- TABLE1とTABLE2があります。 TABLE1は履歴蓄積テーブル。 TABLE2は新規インサート用テーブルです。 両テーブルともにIDフィールドがあります。 TABLE1に取得IDが無ければ、TABLE2にインサート。 TABLE1に取得IDが存在すれば、TABLE2にインサートをおこなわない。 取得IDはテキストファイルにあります。 ------------------------------------------------------- プログラムをするにあたっての方法 ------------------------------------------------------- TABLE1のレコードセットを取得 取得IDをキーにTABLE1のレコードセット・IDフィールドを検索 取得IDがレコードセットに無ければ Insert文でTABLE2に挿入 取得IDがレコードセットに有れば Insertをおこなわない テキストのIDがEOFになるまで繰り返し 終わり

  • 再投稿:フィールドの値をテーブル名&フィールド名にして参照したい

    すみません。若干記入ミスだったので再投稿します。 こちらにご解答お願いします。 TABLE_a ・Ta_id ・key_table ・key_field ・key_no TABLE_b ・Tb_id ・Tb_name TABLE_c ・Tc_id ・Tc_name と3つのテーブルがあり、 key_tableに「TABLE_b」、key_fieldに「Tb_id」が入ってて、 TABLE_aとTABLE_bを select の left join して抽出したい場合、 どういうSQL文になるのでしょうか。 select * from TABLE_a left join case key_table when 'TABLE_b' then 'TABLE_b' when 'TABLE_c' then 'TABLE_c' end on 'TABLE_a.key_field'.key_no = case key_table when 'TABLE_b' then ''TABLE_a.key_table'.Tb_id' when 'TABLE_c' then ''TABLE_a.key_table'.Tc_id' end ; とやってみたのですが、うまくできませんでした。 ご教示お願いします。

  • auto_incrementについて困っています。

    画面上で商品の新規登録するときに、auto_incrementを設定したidが主キーの”商品テーブル”と商品テーブルのidを外部参照して主キーとする”商品詳細テーブル”を使うのですが、商品詳細テーブルでのinsert文はどうすればよいでしょうか?商品の新規登録の時に商品詳細テーブルでは、idを自動的に設定したいのですが・・・、

  • AUTO_INCREMENTの扱いについて

    MySQL 5.6を使用しています。 ユーザーテーブルがあるとします。 ユーザーテーブルにある「ユーザーID」はinsert時にAUTO_INCREMENTで自動採番されます。 ユーザーテーブルの別のカラムで「作成ユーザID」というカラムがあります。insertしたユーザーのユーザーIDを保持するカラムです。 すでにユーザーテーブルにいるユーザー(管理者)がinsertした場合はいいのですが、 自信で自分のユーザーを登録できる機能もあります。 その場合、まだ作成されてないユーザID(AUTO_INCREMENTで自動採番されるユーザーID)をどうやって参照したらいいでしょうか?

    • ベストアンサー
    • MySQL
  • 3つのテーブルの画面表示

    Access 2013 vba リレーションが貼ってある親子関係の3つのテーブルがあったとして・・・ A table: ・ID1(主キー) ・依頼会社ID ・依頼内容 ・金額総合計(Bの会社毎の金額の合計) B table: ・ID2(主キー) ・ID1(外部キー) ・会社ID ・金額計(Cの明細の金額の合計) ・完了日 ※AのID1 : BのID1 = 1 : 多 C table: ・ID3(主キー) ・ID2(外部キー) ・項目名 ・単位 ・数量 ・金額 ※BのID2 : CのID2 = 1 : 多 このようなテーブル構成がある場合に まず、AとBの画面を作りそこでBの情報を入力して 次に、Bの帳票のどれかを選ぶと、 BとCのメイン・サブフォームが表示され、そこでCの明細を入力するというやり方も考えていますが、もう一つ、1つの画面で、BとCを両方サブフォームとして配置し、Bの方のレコードを選択すると、Cの方でそれに対応する明細が表示できるようなものを作りたいです。 このような方法が可能か教えていただきたいのと、その場合のやり方を教えて下さい。 宜しくお願いします。

  • アクセス インポート時の特定レコードの更新について

    ID(連番の主キー:1~1000)をもったレコード1000の「テーブルA」があります。 インポートしたいエクセルには1~50個のIDと付随する情報が記載されています。 エクセルをインポートした際に、「テーブルA」に記載されているIDと紐付くレコードのみを 更新したいのが、どのように実現すればよろしいでしょうか。 ご教示よろしくお願いいたします。

  • インラインビューの更新権限について

    UPDATE句をインラインビューを使って実施しようと思い UPDATE ( SELECT A.FLD1,B.FLD2 FROM TBL1 A,TBL2 B WHERE A.KEY1=B.KEY1 AND CONCAT(A.KEY2,A.KEY3)=B.KEY2 AND B.KEY2='12345') C SET C.FLD1=C.FLD2 のようにSQLを書きました。 ORA-01779: キー保存されていない表にマップする列は変更できません のメッセージが出力されました。 CREATE VIEW TEST AS SELECT A.FLD1,B.FLD2 FROM TBL1 A,TBL2 B WHERE A.KEY1=B.KEY1 AND CONCAT(A.KEY2,A.KEY3)=B.KEY2 AND B.KEY2='12345' でビューを作って確認したら select * from user_updatable_columns where table_name='TEST'; OWNER TABLE_NAME COLUMN_NAME UPDATA INSERT DELETA ---------- ----------- --------------- ------ ------ ------ TEST TEST FLD1 NO NO NO TEST TEST FLD2 NO NO NO 確かにUPDATEできないようです。 テーブルはこんな感じです。 TBL1 ------------------------------------------- KEY1 NUMBER 4 PK KEY2 NUMBER 5 PK KEY3 NUMBER 1 PK FLD1 CHAR 6 TBL2 ------------------------------------------- KEY1 NUMBER 4 PK KEY2 NUMBER 6 PK FLD2 CHAR 6 同じように TBL3 ------------------------------------------- KEY1 NUMBER 2 PK KEY2 NUMBER 4 PK KEY3 CHAR 6 PK KEY4 NUMBER 4 PK FLD3 CHAR 6 TBL4 ------------------------------------------- KEY1 NUMBER 4 PK KEY2 CHAR 6 PK FLD4 CHAR 6 でビューを作ったら CREATE VIEW TEST2 AS SELECT A.FLD3,B.FLD4 FROM TBL3 A,TBL4 B WHERE A.KEY2=B.KEY2 AND A.KEY3=B.KEY3 AND A.KEY1='12' AND A.KEY4='1234' OWNER TABLE_NAME COLUMN_NAME UPDATA INSERT DELETA ---------- ----------- --------------- ------ ------ ------ TEST TEST2 FLD3 YES YES YES TEST TEST2 FLD4 NO NO NO 更新可能なようです。 ビューを作ったとき、UPDATEやINSERT文が有効・無効になる違いは何でしょうか? 毎回一旦ビューを作って select * from user_updatable_columns where table_name='TEST'; のような確認しかできないのでしょうか? よろしくお願いいたします。

  • SQL MIN句

    テーブルには複数の主キーがあり、そのうちの3つの主キーを元に 最も古い日付の情報を取得したいです。 同じデータが複数あるので、副問い合わせ(=)でエラーになると思ったのですが エラーにならずにすべてのデータが取得されてしまいます。 テーブル id name sex date1 1 'A' '男' 20120101 1 'A' '男' 20120101 2 'A' '女' 20120102 select * from table where date1 = (select min(date1) from table where id = 1 and name = 'A' and sex='男'); 下記のような情報を取得するには、SQLとして間違えておりますでしょうか。 ↓ id name sex date1 1 'A' '男' 20120101 1 'A' '男' 20120101 お分かりの方、ご教授頂けませんでしょうか。 以上、よろしくお願い致します。

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

    過去に同様の質問があったかも知れませんが、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にいくつかデータが入っているせいか、どうも上手く反映されません。 単に私の参照方法が下手だったからかもしれませんが…。