- 締切済み
行のコピーと修正方法(履歴管理)
mysql Ver 14.14 Distrib 6.0.4-alpha, for Win32 (ia32) Windows XP です。 次のような表の変更履歴を←の項目で記録しようとしています。 t_カリキュラム; --------------- カリキュラム管理No ← カリキュラム_id ○ 日目 時刻 地域 時限 コース番号 共通か 講義名番号 備考 分担 会場 宿泊 蔵入日 ← 廃止理由 ○ 俗称番号 講師番号 内容に変更があれば、 ・カリキュラム管理Noを(整数)1追加 ・そこに必要な変更を記入 履歴管理として、 ・変更が生じた時の日にちを「カリキュラムのお蔵入り」の意味で、初期値として与えてある"使用中"を「蔵入日」に"080714"などと変更して記入 ・変更理由や要求担当者などを「廃止理由」に記載します 運用としては、「カリキュラム_id」で等号関係をとり、条件として「蔵入日」が"使用中"でないことで常に最新の情報とする予定です。 初心者なので、取り敢えず、コマンドラインからの入力のみで対応したいと思っています。 問題は、「カリキュラム管理No」以外のすべてのfieldをコピーが上手く出来ないことです。 mysql> create table t_curr select * from t_カリキュラム; --安全のため、データごとコピー(構造の設定不要) mysql> truncate table t_curr; --構造は残してデータのみ消去 対応行の総てのfieldとデータとを手入力で、insert into t_curr (カリキュラム管理No,......) values (.... とすれば良いのですが、幾らなんでも効率が悪すぎます。 ここでinsert into table-name select * from table-name where.. 一行まるごとコピーしてしまうと全く元データと同じなのでalterなどで特定出来ません。 特定フィールド以外というのでpostgrsqlなどでは、「^field名」や「!filed名」などによって、このfield名以外と指定出来るそうなのですが、mysqlでは上手く行きません(そのfieldの数字の補数になってしまうようです)。 ヒントを下されば助かります。宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- chukenkenkou
- ベストアンサー率43% (833/1926)
誤記がありました。 create t1_log (logno int primary key auto_increment, ↓ create table t1_log (logno int primary key auto_increment,
- chukenkenkou
- ベストアンサー率43% (833/1926)
#1です。 >特定フィールド以外というのでpostgrsqlなどでは、「^field名」や「!filed名」などに >よって、このfield名以外と指定出来るそうなのです >↓ >http://pc11.2ch.net/test/read.cgi/php/1047317680/98-197 >106,110,111,112の記載です。 >どれ位信頼できるかは分かりませんが、複数らしい人からの記載かと思いまし >た。 誤った書込みであり、PostgreSQLにそういった機能はありません。検索条件などで指定する正規表現のことを、列の選択と間違った形で会話しているようです。 >バージョンは、6.04です。 なぜ、MySQL 6.0.4のalpha版などという、不安定なバージョンを使っているのでしょうか?MySQL 6.0での新機能を使いたい場合を除いて、初心者であるならあるほど、MySQL 5.0や5.1の安定版を使った方がいいですよ? 長いSQLを入力する場合ですが、前回の回答に示したように、SQLを記述したテキストファイルを入力する方法があります。 http://dev.mysql.com/doc/refman/5.1/ja/batch-commands.html また、ある表の全列値を丸ごとコピーし、それに付加情報を持つ場合、次のような記述が可能です。 -- 表定義例 create table t1 (c1 int primary key, c2 int, c3 varchar(10)); create t1_log (logno int primary key auto_increment, c1 int, c2 int, c3 varchar(10)); -- データコピー例 insert into t1_log select null, -- t1_log表のlogno列に入れる値 t1.* -- 「*」だけでなく、「t1.*」のように、表名で修飾 from t1 また、表の特定の列のみ操作し、他の列の存在を意識したくないなら、ビュー経由で操作する方法もあります。 http://dev.mysql.com/doc/refman/5.1/ja/create-view.html
- chukenkenkou
- ベストアンサー率43% (833/1926)
>mysql Ver 14.14 Distrib 6.0.4-alpha, for Win32 (ia32) MySQL 4.1.14の誤りですか? >特定フィールド以外というのでpostgrsqlなどでは、「^field名」や「!filed名」などによって、このfield名以外と指定出来るそうなのです 調べてみましたが、PostgreSQLには、そういった機能はないようです。 どこから得た情報ですか? そういった機能を持つRDBMSがあるということを、聞いたことがないのですが? >対応行の総てのfieldとデータとを手入力で、insert into t_curr (カリキュラム管理No,......) values (.... とすれば良いのですが、幾らなんでも効率が悪すぎます。 まず、正規化を勉強して、冗長な表にしないようにすればいいのでは? また、SQLが長くなって手入力では効率が悪いというなら、sourceコマンドを使って、SQLを記述したテキストファイルを入力すればいいのでは? >一行まるごとコピーしてしまうと全く元データと同じなのでalterなどで特定出来ません。 「alterなどで特定」とは、どういう意味でしょうか? MySQL 5.0以降なら、参照する列だけを定義したビューを作ればいいでしょう。 MySQL 4.1以前なら、SQLを記述したテキストファイルを入力する方法が簡単でしょう。
補足
早速のお返事を有難うございます。 >mysql Ver 14.14 Distrib 6.0.4-alpha, for Win32 (ia32) ↓ バージョンは、6.04です。 :\DB>mysql --version mysql Ver 14.14 Distrib 6.0.4-alpha, for Win32 (ia32) 上記の如く出力をそのまま記載しました。 >特定フィールド以外というのでpostgrsqlなどでは、「^field名」や「!filed名」などによって、このfield名以外と指定出来るそうなのです ↓ http://pc11.2ch.net/test/read.cgi/php/1047317680/98-197 106,110,111,112の記載です。 どれ位信頼できるかは分かりませんが、複数らしい人からの記載かと思いました。 >対応行の総てのfieldとデータとを手入力で、insert into t_curr (カリキュラム管理No,......) values (.... とすれば良いのですが、幾らなんでも効率が悪すぎます。 ↓ mysql> insert into t_curr values(343,61,14,'未定','未定',1,2,'y',39,'未定','未定','未定','BPU想定','80714','リビジョン折込と講師、企業の記入',35,20); とすれば良いのですが、field数が多い表や修正データが多いと作業が大変になりそうという意味合いです。 ~~~~~~~~~~~~ [項目の説明] ・カリキュラム管理No (primary key 整数。改訂版は、追加したカリキュラム管理Noに記載) ・カリキュラム_id (実体に固有の番号:修正前の番号と改定版の番号は同じ) ・蔵入日(初期値は、"使用中"で、使用しなくなると"080715"などに変更 同一実体の過去の記録にはすべて日にち"0807.."などが入っており、最新版のみが"使用中") <修正したい行(カリキュラム管理No=61)> 61,61,14,'未定','未定',1,2,'y',39,'未定','未定','未定','BPU想定','80714','リビジョン折込と講師、企業の記入',35,20 修正が必要となるフィールドは、その都度異なるため、構想としては、まず、「カリキュラム管理No」(primary key)の番号を増して、primmary key部分以外をそこにコピーして <カリキュラム管理Noの最後(342)の次の行に上記の61を343として、61以外のデータをコピー> 343,61,14,'未定','未定',1,2,'y',39,'未定','未定','未定','BPU想定','80714','リビジョン折込と講師、企業の記入',35,20 <次にupdate(済みません、alterは間違い)で必要箇所を修正> というイメージです。 >一行まるごとコピーしてしまうと全く元データと同じなのでalterなどで特定出来ません。 ↓ 失礼しました、updateの間違いです。 上述の如く、一度同一の行を丸々作っておいて、部分的に修正することを考えました。 update t_curr set 俗称番号=47 where ****; ですが、丸々同じですから当然****で特定は出来ないという状況を書きました。 皆さんは、こんなやり方はされていないだろうと思いつつも、書籍を見たり、ネットで検索してもなかなか見つからず、近くに相談できる人も居ないので質問させて頂いています。 宜しくお願いいたします。
お礼
有難うございました。 1列頭に増やしておいて、 insert into t1_log select null, t1.* from t1 挿入時に入れ込めばいけますね。 ・SQLは、頭を柔らかくして色んな見方が出来ないといけない--クイズみたい..。 ・バージョンについてはご指摘のように安定版にしようと思っています。 ・SQLを記述したテキストファイルは、普通の実行の時にsourceとして指定する使い方をしています。 必要に応じて、csvで出したり入れたりはしていますが、もうひとつ使いにくくて..。 ・viewを使う手もあるのですね。 色々とご丁寧に有難うございました。 もっと頑張らなくっちゃ。