- ベストアンサー
主キーを指定してフィールドを1万行追加するには
フィールドがいくつかあるテーブルがあります。 主キーが78532456から始まり、1ずつ増加します。 これを1万行追加したいです。 MYISAMでやっています。 どのようにすれば、重複な値を出さずに追加できますか。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ストアドプロシージャを利用しましょう //準備 //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);
その他の回答 (4)
- yambejp
- ベストアンサー率51% (3827/7415)
UPDATE テーブル SET 更新日時フィールド=now(),作成日時フィールド=now() じゃだめなの?
お礼
できました。有難うございました。
- yambejp
- ベストアンサー率51% (3827/7415)
>テーブルには、afieldが更新されたときに更新される日時が入るupdate_dayと >作成したときの日時が入るnew_dayがあります。 >更新日時 update_day timestamp null DEFALT null >作成日時 new_day timestamp null DEFALT null ごめんなさい。補足の意味がわからないのだけど 更新日時にしても作成日時にしてもどうしたいの? たとえば、 ・xxxx年xx月xx日からyyyy年yy月yy日の間のランダムの値にする ・更新日時はかぶってはいけない(単純なランダムより結構やっかい) ・ID順に更新日はバックデートしてはいけない(これはすごく面倒) ・更新日時は作成日時と同じか新しくなくてはいけない みたいに書かないとエスパーじゃないんだから他人には伝わらないよ
お礼
>・xxxx年xx月xx日からyyyy年yy月yy日の間のランダムの値にする 年月日の表示で、ランダムでなくていいです。 >・更新日時はかぶってはいけない(単純なランダムより結構やっかい) かぶってもいいです。 >・ID順に更新日はバックデートしてはいけない(これはすごく面倒) >・更新日時は作成日時と同じか新しくなくてはいけない レコードを作成したときは、更新日時と作成日時が同じになっています。 更新日はafieldのデータを更新したときだけ、その都度更新させます。 そのとき作成日時は更新しないで常に作成した日にします。
- yambejp
- ベストアンサー率51% (3827/7415)
>主キーだけが入って、その他のフィールドは空っぽのレコードがずらっとできました。 そういう風にかきましたよ、それ以外の仕様書いてなかったし そもそもテーブルの構成もわからないし >主キーがXXX~XXXまでの間のAフィールドをXXX、BフィールドをXXX、 >とそれぞれ設定してUPDATEを実行。 >上以外の主キーがXXX~XXXまでの間の・・・ >さらに上以外の主キーがXXX~XXXまでの間の INSERTの方法によってはできるんじゃないでしょうかねぇ ある程度仕様をだしてもらえば考えてみやすよ
お礼
すみません。有難うございます。 テーブルには、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)
>INSERT IGNORE INTO `maintable`(`no`) VALUES(start_id + i); MySQLのバージョンはいくつでしょうか? たとえば CALL PROC_ADDID(100,100); など小さめの数でやってみていけますか?
お礼
5.0.51aです。 主キーだけが入って、その他のフィールドは空っぽのレコードがずらっとできました。 これで正しくできたのでしょうか。 それぞれのフィールドにデータを入れていくのは、できればバラバラのデータを入れたいです。 主キーがXXX~XXXまでの間のAフィールドをXXX、BフィールドをXXX、とそれぞれ設定してUPDATEを実行。 上以外の主キーがXXX~XXXまでの間の・・・ さらに上以外の主キーがXXX~XXXまでの間の・・・ それを何十通りもやる、みたいなやり方になりますか。
お礼
有難うございます。やってみましたが解決しませんでした。すでに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)。