• ベストアンサー

主キーを指定してフィールドを1万行追加するには

フィールドがいくつかあるテーブルがあります。 主キーが78532456から始まり、1ずつ増加します。 これを1万行追加したいです。 MYISAMでやっています。 どのようにすれば、重複な値を出さずに追加できますか。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ストアドプロシージャを利用しましょう //準備 //idをプライマリにダミーでdataカラムをつくっておきます create table hoge(id bigint not null primary key,data varchar(10)); //そもそもプライマリにすればidは重複しません //ここからプロシージャの宣言 DROP PROCEDURE IF EXISTS PROC_ADDID; DELIMITER // CREATE PROCEDURE PROC_ADDID(IN start_id BIGINT,IN range_id INT) BEGIN DECLARE i INT DEFAULT 0; WHILE i<range_id DO INSERT IGNORE INTO `hoge`(`id`) VALUES(start_id + i); SET i=i+1; END WHILE; END // DELIMITER ; //ここまで //mから始まるn個のデータをつくるには CALL PROC_ADDID(m,n); CALL PROC_ADDID(78532456,10000);

juju-juju
質問者

お礼

有難うございます。やってみましたが解決しませんでした。すでに10行分データを入れた状態で、主キーを設定し、データを入れている状態なので、create table hoge(id bigint not null primary key,data varchar(10));はやりませんでした。 DROP PROCEDURE IF EXISTS PROC_ADDID;# 返り値が空でした (行数 0)。 DELIMITER // CREATE PROCEDURE PROC_ADDID(IN start_id BIGINT,IN range_id INT) BEGIN DECLARE i INT DEFAULT 0; WHILE i<range_id DO INSERT IGNORE INTO `maintable`(`no`) VALUES(start_id + i); SET i=i+1; END WHILE; END // # 返り値が空でした (行数 0)。 DELIMITER ; CALL PROC_ADDID(78532456,10000);# 返り値が空でした (行数 0)。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

UPDATE テーブル SET 更新日時フィールド=now(),作成日時フィールド=now() じゃだめなの?

juju-juju
質問者

お礼

できました。有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>テーブルには、afieldが更新されたときに更新される日時が入るupdate_dayと >作成したときの日時が入るnew_dayがあります。 >更新日時 update_day timestamp null DEFALT null >作成日時 new_day timestamp null DEFALT null ごめんなさい。補足の意味がわからないのだけど 更新日時にしても作成日時にしてもどうしたいの? たとえば、 ・xxxx年xx月xx日からyyyy年yy月yy日の間のランダムの値にする ・更新日時はかぶってはいけない(単純なランダムより結構やっかい) ・ID順に更新日はバックデートしてはいけない(これはすごく面倒) ・更新日時は作成日時と同じか新しくなくてはいけない みたいに書かないとエスパーじゃないんだから他人には伝わらないよ

juju-juju
質問者

お礼

>・xxxx年xx月xx日からyyyy年yy月yy日の間のランダムの値にする 年月日の表示で、ランダムでなくていいです。 >・更新日時はかぶってはいけない(単純なランダムより結構やっかい) かぶってもいいです。 >・ID順に更新日はバックデートしてはいけない(これはすごく面倒) >・更新日時は作成日時と同じか新しくなくてはいけない レコードを作成したときは、更新日時と作成日時が同じになっています。 更新日はafieldのデータを更新したときだけ、その都度更新させます。 そのとき作成日時は更新しないで常に作成した日にします。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>主キーだけが入って、その他のフィールドは空っぽのレコードがずらっとできました。 そういう風にかきましたよ、それ以外の仕様書いてなかったし そもそもテーブルの構成もわからないし >主キーがXXX~XXXまでの間のAフィールドをXXX、BフィールドをXXX、 >とそれぞれ設定してUPDATEを実行。 >上以外の主キーがXXX~XXXまでの間の・・・ >さらに上以外の主キーがXXX~XXXまでの間の INSERTの方法によってはできるんじゃないでしょうかねぇ ある程度仕様をだしてもらえば考えてみやすよ

juju-juju
質問者

お礼

すみません。有難うございます。 テーブルには、afieldが更新されたときに更新される日時が入るupdate_dayと 作成したときの日時が入るnew_dayがあります。 更新日時 update_day timestamp null DEFALT null 作成日時 new_day timestamp null DEFALT null DELIMITER $$ CREATE TRIGGER tri1 BEFORE UPDATE ON dbtable FOR EACH ROW BEGIN IF NEW.afield != OLD.afield THEN SET NEW.update_day = now(); END IF; END; $$ DELIMITER ;

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>INSERT IGNORE INTO `maintable`(`no`) VALUES(start_id + i); MySQLのバージョンはいくつでしょうか? たとえば CALL PROC_ADDID(100,100); など小さめの数でやってみていけますか?

juju-juju
質問者

お礼

5.0.51aです。 主キーだけが入って、その他のフィールドは空っぽのレコードがずらっとできました。 これで正しくできたのでしょうか。 それぞれのフィールドにデータを入れていくのは、できればバラバラのデータを入れたいです。 主キーがXXX~XXXまでの間のAフィールドをXXX、BフィールドをXXX、とそれぞれ設定してUPDATEを実行。 上以外の主キーがXXX~XXXまでの間の・・・ さらに上以外の主キーがXXX~XXXまでの間の・・・ それを何十通りもやる、みたいなやり方になりますか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MDB内既存テーブルに主キーのフィールド追加は可能か?

    DAOでMDBにアクセスするシステムなのですが、 テーブル仕様変更に伴い、既存のテーブルに新規に主キーとなるフィールドを追加します。 当テーブルはすでに主キーは複数存在しています。 現在は CreateIndex("PrimaryKey")を行ったのですが、 「既に主キーは既に存在しています」と表示されてしまい、異常終了をしてしまいます。 単にフィールド追加することは容易なのですが、主キーとなると、だめみたいです。 この場合は、どのようにすれば良いのでしょうか? 大変申し訳ございません。 ご教授よろしくお願い致します。

  • 1万件のレコードの追加方法、主キーは億単位で不規則

    テスト用のテーブルを作りたいと思っています。しかし、主キーの部分が実際とはかけ離れた状態になってしまいます。 フィールド数が複数あり、同じ値でも構わないので1万件分のレコードを追加したいです。 やり方としては、 <1>主キーのフィールド以外の全部のフィールドを作ってデータを入れます。 <2>そしてから、INSERT INTO `aaa` SELECT * FROM `aaa`を1万件超えるまで繰り返し実行。 <3>主キーのフィールドをauto_increment指定して追加します。 <4>1万を超えるフィールドを削除するためにDELETE FROM `aaa` WHERE id>10000を実行 ※実際には主キーにauto_incrementを入れません。 ※実際には主キーのデータは数千万~億単位(89234521や000455839)の数字(型はBIGINT)で、増加の仕方はまちまちです。 auto_incrementを使わず、数千万単位の数字で、増加の仕方もまちまちな主キーのデータを追加する方法はないでしょうか。

    • ベストアンサー
    • MySQL
  • 未定義になるのは主キーじゃないのが原因?

    二つのテーブルを一対多のリレーションシップで繋ぐとき、 一になる方は主キーじゃないと、一対多にならなかったり参照整合性はできないのでしょうか? 主キーではないテーブル1のフィールド(一)と、(多)のテーブル2のフィールドでリレーションを組もうと思ってるのですが、 リレーションシップの種類が未定義になってしまいます。 これは、1になる方のテーブル1が主キーじゃないのが原因なのでしょうか? テーブル1のこのフィールドは、重複することはありませんが、空白も入る為、主キーにできないし、 主キーはほかのフィールドで使っています。

  • ACCESS2000の主キー重複について

    いつもお世話になっています。 早速ですが、お教えください テーブル名:AMaster フィールド名:B があります。 「B」は主キーになっていまして、ユーザーが任意に数字をいれることになります。 主キーになっていますので基本的には重複しないのですがユーザーの押し間違いなどによって重複してしまった場合 [Microsoft][ODBC Microsoft Access Driver] インデックス、主キー、またはリレーションシップで値が重複しているので、テーブルを変更できませんでした。重複する値のあるフィールドの値を変更するか、インデックスを削除してください。または重複する値を使用できるように再定義してください。 といったエラーメッセージが出ます。これは出ても構わないのですがツールバーの「戻る」でしか今後の操作ができなくなってしまうので(ユーザーはPC超初心者)何らかの形でエラーメッセージとともに任意のページへ戻れるようにしたいと考えています。 つきましては、「B」フィールドにあるデータとこれから入力される数値が重複していたら・・・という記述をお教えいただきたいと思います。 ASPにて作成していますのでそれに対応した記述ですとありがたいです。 過去のログに似たようなものがありましたがこちらを参照してもボクにはわかりませんでした。 http://okweb.jp/kotaeru.php3?q=357614 ボクも何分初心者なのでわからないことだらけですがよろしくお願いします。

  • Access 主キーについて

    Accessでテーブルを作りCSVファイルをテーブルへ読み込みました。その時は主キーを設定しませんでした。1000件あるデータは1000件分読み込めました。 次にテーブルのデータを消して、主キーを2フィールドに設定して、同じように1000件分のデータを読み込んだら950件分しか読み込めませんでした。これは50件は重複するデータがありますよということなのでしょうか?

  • 「主キー以外重複データ(フィールド多数)」の抽出

    タイトルのような抽出方法が必要になり、その出し方で困っています フィールドが100以上ある大きなテーブルが複数(フィールド構造は全く同じ)あり、 そのレコードを一つにまとめる為重複データを抽出し削除したいのです 条件は「主キー以外の全てのフィールドのデータが一致してる重複データ」であり、 それをどうやればAccessの機能で出せるのか悩んでいます。 最初はクエリでグループ化して出そうと思ったのですがこのフィールド数では全て グループ化はできず、 VBAで一行ずつループで処理しようにもキー以外の全フィールド一致とする検索条件のSQLのWHERE式が複雑すぎると出て処理できませんでした フィールド数が多大なテーブルで主キー以外完全一致の重複レコードをうまく抽出するにはどうすればいいのでしょうか?

  • ACCESSにインデックス(主キー)のあるテーブルを作りたい

    元データがEXCELでそのデータを利用し、 ACCESS内にマスター用(品目マスタ)のテーブルを作り、 1番目の部品コードというフィールドを インデックス/主キー(重複しない)にして 2番目、3番目の項目の値をえられるように しようとしていますが、EXCELからの元データを インポートしようとしても部品コードフィールドが インデックス/主キーに設定できません。 EXCEL内で部品コードが重複しないように削った つもりです。 部品コードが重複していなくても、いけない文字列 があってインデックス/主キーにできないのでしょうか? ※詳細 以下のようなテーブルをつくり、 284-A80と入力したら製品部品名称の「基板」と いう値や製品分類の「LED」という値を得ようと している。 部品コード    製品部品名称   製品分類 284-A80      基板        LED 7841P20      ヨーク       ブザー CL-270-CD     LED         LED HSDL-3201#001   センサー     センサー ……約17000レコードぐらい ただし、部品コードの値がもっとごちゃごちゃして いて、「*」、「スペース」「#」「_」「/」などや カタカナ文字のものも含まれていたりします。 なぜ、上記の部品コードをインデックス/主キーとして 設定をおこなったテーブルとしてインポート できないのですか?

  • 主キーを追加しようとするとエラー

    MYSQL4.0を使っていますが、 テーブル作成後、主キーを追加しようと ALTER TABLE MYTABLE ADD PRIMARY KEY ID; などと書くと、syntaxエラーになってしまいます。 どこが悪いのでしょうか、 分かる人がいましたら教えてください。

    • ベストアンサー
    • MySQL
  • 主キーの変更

    次のようなテーブルが存在します。レコードはあくまで参考の値です。主キーについては必ず一意の値になるようにしています。 代理店sample1がIDを紛失し、再発行を依頼された場合や,その下の顧客店やこきゃくがIDを紛失し、再発行をする場合に既存のデータをそのまま保持したまま主キーだけを変更して関連された他のテーブルに一斉に反映させるにはどうすればよいでしょうか? ここには記載していませんが顧客店IDやこきゃくIDに関連する別テーブルが10ほど存在します。 主キーが存在するレコードと重複していないかをまずチェックしてそこから基礎となるテーブルに書き換えを行いと考えているのですが、思考がそこで止まってしまっています。 よろしければアドバイスをよろしくお願いいたします。 代理店テーブル |代理店ID(主キー) |代理店名| |        aaaaa | sample1| |        bbbbb | sample2| 顧客店テーブル |代理店ID(主キー) |顧客店ID(主キー)|顧客店名| |        aaaaa |      a-00001| ○○1店| |        aaaaa |      a-00002| ○○2店| |        bbbbb |      b-00001| △△1店| |        bbbbb |      b-00002| △△2店| 顧客テーブル |顧客店ID(主キー) |      こきゃくID(主キー)| こきゃく名| |        a-00001|    a-20071015-00001| Aさん   | |        a-00002|    a-20071015-00002| Bさん   | |         b-00001|     b-20050915-00001| Cさん   | |        b-00002|    b-20050915-00002| Dさん   |

  • テーブルに主キーを作らないデメリットは?

    アクセスのテーブルを作るにおいて 主キーのフィールドを作らなかった場合、 どのようなデメリットや不都合がありますか? 既にいくつか主キーのないテーブルを作ってしまいました。 このまま運用しようか主キーを作るべきか悩んでいます。 SQLサーバーに移行する場合などにエラーになるのでしょうか?