• 締切済み

行のコピーと修正方法(履歴管理)

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の数字の補数になってしまうようです)。 ヒントを下されば助かります。宜しくお願いします。

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

みんなの回答

回答No.3

誤記がありました。 create t1_log (logno int primary key auto_increment, ↓ create table t1_log (logno int primary key auto_increment,

回答No.2

#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

kayggl
質問者

お礼

有難うございました。 1列頭に増やしておいて、   insert into t1_log   select   null, t1.*   from t1 挿入時に入れ込めばいけますね。 ・SQLは、頭を柔らかくして色んな見方が出来ないといけない--クイズみたい..。 ・バージョンについてはご指摘のように安定版にしようと思っています。 ・SQLを記述したテキストファイルは、普通の実行の時にsourceとして指定する使い方をしています。 必要に応じて、csvで出したり入れたりはしていますが、もうひとつ使いにくくて..。 ・viewを使う手もあるのですね。 色々とご丁寧に有難うございました。 もっと頑張らなくっちゃ。

回答No.1

>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を記述したテキストファイルを入力する方法が簡単でしょう。

kayggl
質問者

補足

早速のお返事を有難うございます。 >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 ****; ですが、丸々同じですから当然****で特定は出来ないという状況を書きました。 皆さんは、こんなやり方はされていないだろうと思いつつも、書籍を見たり、ネットで検索してもなかなか見つからず、近くに相談できる人も居ないので質問させて頂いています。 宜しくお願いいたします。

関連するQ&A

  • 管理番号が2つあるデータの設計と抽出について

    WindowsXP、Access2007を使用しています。 レンタルしている商品の管理番号が2つあります。一つはお客様用の番号で、お客様の要望により番号が変更されることがあります。もう一つは会社の管理用の番号で、番号が変わることはありません。 検索する際は、最新のお客様用管理番号で検索したいと思っています。(会社の管理番号で検索することはありません。又、お客様用の管理番号は過去に重複する番号があったりするので、最新の番号で検索しなければなりません。) そのレンタルの入出荷の管理システムを作っています。 T管理台帳・・・シリアルNO(テキスト、主キー)サイズID(数値)仕様ID(数値)、仕入時管理番号(テキスト) T台帳明細・・・シリアルNO(テキスト、主キー)、明細NO(数値、主キー)、最新管理番号(テキスト) 上記のテーブルを基に”動静入力フォーム(T管理台帳)”、”動静入力サブフォーム(T台帳明細)”を作りました。 以前は、T管理台帳にも最新管理番号のフィールドを作って、フォームを閉じる際にサブフォームから代入させていました。 今回、作り直すことになりT管理台帳とT台帳明細をクエリで結ぶことで、T管理台帳に最新管理番号のフィールドを作らなくても検索などできるのではないかと思い、色々ためしています。 が、更新ができないクエリになってしまい困っています。 まず、上記のようなデータだと、T管理台帳に最新管理番号フィールドを作らなければ、最新管理番号での検索は難しいですか? そもそもテーブルの設計が悪いのか、やり方がまずいのかわからず困っています。

  • PHPからMySQL・異なるDBにコピー

    PHPからMySQL・異なるDBに接続し同じ構造のテーブルのデータをコピーすることは可能ですか? 以下を実行するとクエリが実行されず「コピーできません」が表示されてしまいます。 どのようにすればコピーできるか教えてください。 $connect1 = mysql_connect("localhost", "user1", "pass1") ; mysql_select_db("db1", $connect1); //db1内にtable1 $connect2 = mysql_connect("localhost", "user2", "pass2") ; mysql_select_db("db2", $connect2); //db2.内にtable2 $sql = "INSERT INTO `db1` . `table1` SELECT * FROM `db2` .`table2`;"; $result = mysql_query($sql, $connect1)or die("コピーできません"); //$result内「$connect1」でも「$connect2」結果は同じです。 //table1とtable2の構造は同じです。

    • ベストアンサー
    • PHP
  • mySQL

    今日は mySQLにて あるテーブルへデータを入れようと、 INSERT INTO table VALUES( "000", "?", "試験" ) といった具合に、入れてみました。 アクセスでリンクしてあるので、フィールドを見ると 半角「?」はNULLに置き換えられてますが なぜ?

  • MYSQLのINSERT記述をもっと分かりやすくしたい

    MYSQLで、DB更新の時の記述の基本はこんな感じですよね。         UPDATE             テーブル名         SET             `フィールド名`  =   "データ名",             `フィールド名`  =   "データ名",             `フィールド名`  =   "データ名",             `フィールド名`  =   "データ名" 「フィールド」と、「値」が横に並んでて実に見やすい、分かりやすい。 ところが新規挿入の時は         INSERT         INTO             テーブル名         (             `フィールド名`,             `フィールド名`,             `フィールド名`         ) values (             `データ`,             `データ`,             `データ`         ) と、「フィールド」と「値」が縦にならんでて、 どれがどれに対応しているのか実に分かりにくい。 フィールドが20個も30個もなると だんだん分けがわからなくなってくる。 そこで、みなさんは、インサートする時の記述はどのように工夫して 分かりやすくしているでしょうか。 今まで、行番号の下一桁を揃えたり、/*10行目*/ /*20行目*/ 等のコメント文を入れたりしていましたが、 根本的解決にならず分かりにくいままでした。

    • ベストアンサー
    • MySQL
  • レコードのコピーについて

    PostgreSQLで質問があります。 table_Aの内容をtable_Bにコピーしたいと考えています。 create table table_B as select * from table_A; だと、table_Aのフィールドでserial型を使用しているため、 integerになってしまいます。 できれば上記以外でかつ、table_Bは既に作成されて いる状態でコピーを行いたいと考えています。 insert into table_b as select * from table_A; とかでできるんでしょうか? それとも他にいい案があるのでしょうか? 確認する環境がないのでわからないのですが、 どなたかご存知の方、お願い致します。

  • md5で暗号化して別フィールドにinsertしたい

    このようなMySQLのtable1があります。 id , name , comment   , ango 1 aoki こんにちは   null 2 inoue おはよう null 3 ueno こんばんは null 4 ono こんにちは null idはprimaryでauto_incrementです。 commentデータをmd5で暗号化して、angoのフィールドに入力したいのですが、うまくいきません。 select comment, md5(comment) from table1 を実行したところ、全てのcommentデータが暗号化されたのですが、それをangoフィールドにinsertしようとするとエラーが発生します。 insert into table1 (ango) select comment, md5(comment) from table1 #1066 - Not unique table/alias: 'table1' 検索してみたら同じ状況の方がいました。私もMySQLは3.23.58を利用しているのでそれが原因のようです。 http://www.mysql.gr.jp/mysqlml/mysql/msg/10401 MySQLのバージョンを上げることなく、どのような手順でやれば可能でしょうか?

    • ベストアンサー
    • MySQL
  • MySQLで、指定の複数カラムのみコピーする方法

    同じ構造の、  A_table と B_table があります。 それぞれに  id date name address mail comment という、6つのカラムがあります。 変更があった際に、 A_table にcsvで全データをインポートし、  B_table に変更のあったカラム( date name address mail )の列だけをコピーしたいと思っています。 ( id )は A_table と B_table 共通にし、変更しないことを前提としています。 ( comment )は外部から編集できるため、csvデータが最新の情報とは限りませんので、 csvデータでの変更は考えておりません。 レコード数としては、多い方だと思います。 上記の作業をしようと思っているのですが、 >> B_table に変更のあったカラム( date name address mail )の列だけをコピー する方法をご存じの方がいらっしゃいましたら、何卒、ご教授お願い致します。 また、 変更したいカラムだけ、csvデータとidを共通にすればインポート可能かな…と探してはみたのですが無いようで、こちらはできないと考えても大丈夫なのでしょうか。 (phpmyadminを利用しておりますが、カラム名を指定してインポートはできるのですが、  指定しないカラムは空白になって上書きされてしまいます。) ついでで申し訳ないですが、宜しければアドバイスをいただければと思います。

  • mysql 顧客管理ツールの項目について

    mysqlを使って顧客管理ツールを作ろうと思っています。 それでmysqlのフィールドに、必要であろう項目を英語名で 作成しようと思います。 そこで質問は2点あります。 1.顧客(企業)をPCで管理する場合に最低限必要な情報はなにがあるか。 2.そのためのフィールドをmysqlに作るための英語名としてはどんなモノが適当か 以上の2点が知りたいです。 よろしくおねがいします。

    • ベストアンサー
    • MySQL
  • テーブルの中身を違うテーブルへコピー

    お世話になります。 SQLについて質問があるのですが・・・。 Aというテーブルがあり、何件かデータが入っています。 そのAテーブルにフィールドを2つ新たに追加したいのです。 ALTER TABLEは使わずに、 以下の様な操作をしたいと考えております。 1:Aテーブルを違う名前に変更。  もしくはテーブルを丸々コピー。 2:テーブルBを作成。   (テーブルAのフィールドに2つフィールド追加した内容) 3:テーブルBにテーブルAの内容を丸々コピー。   その際、新規に追加した2つのフィールドには、初期値として、何かの文字or数字を入れる。 4:Aテーブルを削除 と、いう感じです。 作成はINSERT、削除はDROPを使えばいいのかなーって 思っているのですが、 テーブル名の変更や、テーブルの内容のコピーが ちょっと分かりません。 上記について、ご教授の程、よろしくお願いします。 なお、DBにはSQL Serverを使用しています。

  • [VB2008] datatableを使ったDB(mdb)更新でのバグ

    VB2008(Express Edition)で、アクセス(mdb)のデータベース更新をしていたのですが、 テーブルのフィールド名が「No」だとデータベース更新の際、エラー終了(インサート文~というエラー)してしまいます。 http://homepage1.nifty.com/rucio/main/VBdotNet/Database/Database4.htm 上記のサイトの一番下にある方法で、Adapter.Fill(Table)で、読み込んだデータテーブルにレコードを追加し、Adapter.Update(Table)で、データベースを更新しています。 フィールド名が例えば「製造No」とかだとエラーも無いのですが、「NO or no or No or oN」だとエラー終了するみたいです。全角はまだ試してないです。 これって、何のバグでしょうか?分かる方、どうか宜しくお願いします。